153 வாசிப்புகள்

Code Smell 304: Null Pointer Exception - Runtime Crashes காரணமாக NULL References தவிர்க்க எப்படி

மூலம் Maximiliano Contieri9m2025/06/20
Read on Terminal Reader

மிக நீளமானது; வாசிப்பதற்கு

Null-safe patterns பயன்படுத்தி Runtime crashes ஏற்படுத்தும் NULL இணைப்புகளை தவிர்க்கவும்
featured image - Code Smell 304: Null Pointer Exception - Runtime Crashes காரணமாக NULL References தவிர்க்க எப்படி
Maximiliano Contieri HackerNoon profile picture

I keep writing about NULL problems, yet every day the news reminds me: NULL is still alive and kicking.நான் NULL பிரச்சினைகள் பற்றி எழுதுகிறேன், ஆனால் ஒவ்வொரு நாளும் செய்தி என்னை நினைவு கூறுகிறது: NULL இன்னும் உயிருடன் உள்ளது.


TL;DR: Null-safe patterns பயன்படுத்தி Runtime crashes காரணமாக NULL குறிப்புகள் தவிர்க்கவும்

TL;DR: Null-safe patterns பயன்படுத்தி Runtime crashes காரணமாக NULL குறிப்புகள் தவிர்க்கவும்

பிரச்சினைகள்

  • Runtime கழிவுகள்
  • பெரிய விபத்துகள் மற்றும் விபத்துகள்
  • அநியாயமான செயல்பாடு
  • கடினமான debugging
  • பயனர் frustration
  • அமைப்பு instability
  • நிரந்தர நம்பிக்கை

இல்Google கிழக்குதமிழ் :

  • தவறான தவறான செயற்பாடு: Null data நன்றாக செயல்படுவதற்கான மாறாக, code crashed
  • No feature flags: New code was not gradually rolled out with safety controls - புதிய குறியீடு பாதுகாப்பு கட்டுப்பாடுகளால் வெளியிடப்படவில்லை
  • Next Topic: கதுவா: ஒரு குரூரமான குற்றம் எவ்வாறு அரசியல் மற்றும் மத சாயம் பூசப்பட்டு ஒற்றை பரிமாணமாக்கப்பட்டது
  • No Randomized Backoff: Recovery Caused Infrastructure Overload (அதிகப்படுத்துதல் இல்லை)
  • தவறான சோதனை: விண்ணப்பத்தில் தவறான சோதனை எப்போதும் செய்யப்படவில்லை

தீர்வுகள் 🙂

  1. 0 0 தவிர்க்கவும்
  2. nulls உங்கள் கட்டுப்பாட்டில் இல்லை என்றால் nulls ஐப் பயன்படுத்தவும் (எனவே, ஒரு வெளிபட்ட API)
  3. முதலீட்டாளர்களின் எண்ணிக்கை
  4. காவல்துறையினரின் பாதுகாப்பு
  5. Null Objects பயன்பாடு
  6. Options பயன்படுத்தாதீர்கள்

திருவிழா ️

https://hackernoon.com/code-refactoring-tips-no-015-remove-null

kontekst

ஜூன் 12, 2015 aபெரிய தடவைGoogle Cloud Platform இல் இது நடந்தது.


இது உலகம் முழுவதும் Google Cloud மற்றும் Google Workspace சேவைகளை சுமார் 10:49 AM முதல் 1:49 PM PDT வரை (3 மணிக்கு மேல்) பாதித்தது, சில சேவைகள் முழுமையாக மீட்க அதிக நேரம் எடுக்கும்.


இதன் காரணமாக Google’s API management system இல் ஒரு தவறு ஏற்பட்டது:


  • Trigger இல் :

மே 29, 2025 இல், Google "Service Control" (அவர்களின் API மேலாண்மை அமைப்பு) புதிய குறியீடு செயல்படுத்தியது.


இந்த குறியீடு ஒரு முக்கியமான தவறு இருந்தது.அது சரியான இல்லைதவறான செயல்பாடுகாப்பாற்றப்படவில்லைபுகைப்படம் flags.


  • இழப்பு :

ஜூன் 12ஆம் திகதி ஒரு மாற்றத்தை ஏற்படுத்தியது.0 0இதே சூழல், ஒவ்வொரு ஆண்டும் தொடர் கதையாக இருந்தும், அதிகாரிகள் போதிய கவனம் செலுத்த முன்வரவில்லை. .............................................................................................. இது எத்தனையாவது [...]


  • உலகளாவிய விளைவுகள் :

ஏனெனில் கோரிக்கை நிர்வாகம் உலகம் முழுவதும் உள்ளது, இந்த குழப்பமான தரவு சில நிமிடங்களில் உலகம் முழுவதும் திருத்தப்பட்டது, ஒவ்வொரு பகுதிகளில் சேவை கட்டுப்பாட்டு அழிவு ஏற்படுத்தப்பட்டது.


Null pointer exceptions occur when you try to access methods or properties on objects that do not exist.


இந்த மாற்றங்கள் மதிப்பெண்களின் மாற்றங்களை தவிர்ப்பது தவறாகும்.This happens when variables contain null references instead of valid object instances.


இந்த பிரச்னை உற்பத்தி சூழ்நிலைகளில் மிகவும் கடினமாக இருக்கும், இதனால் இந்த விதிமுறைகள் உங்கள் பயன்பாட்டை அழித்து, பயனர்களை ஆச்சரியப்படுத்த முடியும்.


Java, C#, மற்றும் JavaScript போன்ற வார்த்தைகள் இந்த பிரச்சினையை மிகவும் பாதிக்கப்படுகின்றன, ஆனாலும் modern language features and patterns can help you avoid these crashes entirely.


Nulls நூறு ஆண்டுகளாக மென்பொருள் வணிகத்தில் ஒரு முக்கியமான பிரச்சினை ஆகும், ஆனால் மென்பொருள் நிபுணர்கள் தங்கள் படைப்பாளரின் எச்சரிக்கைகள் கூட அவற்றை எச்சரித்து வருகின்றன.

குறியீடு

தவறான

public class ServiceControlPolicy {
  private SpannerDatabase spannerDB;
  private QuotaManager quotaManager;
    
  public void applyPolicyChange(PolicyChange change) {
      // NULL POINTER: change can be null
      Policy policy = spannerDB.getPolicy(change.getPolicyId());
      // NULL POINTER: policy can be null from the database
      String quotaField = policy.getQuotaField();
      // NULL POINTER: quotaField can be null (blank field)
      quotaManager.updateQuota(quotaField, change.getValue());
  }
    
  public void exerciseQuotaChecks(String region) {
      // NULL POINTER: policies list can be null
      List<Policy> policies = spannerDB.getPoliciesForRegion(region);
      for (Policy policy : policies) {
          // NULL POINTER: individual policy can be null
          String quotaValue = policy.getQuotaField();
          // NULL POINTER: quotaValue can be null before trim()
          quotaManager.checkQuota(quotaValue.trim());
      }
  }
    
  public boolean validatePolicyData(Policy policy) {
      // NULL POINTER: policy parameter can be null
      String quotaField = policy.getQuotaField();
      // NULL POINTER: quotaField can be null before length()
      return quotaField.length() > 0 && 
             !quotaField.equals("null");
  }
    
  public void replicateGlobally(PolicyChange change) {
      List<String> regions = getGlobalRegions();
      for (String region : regions) {
          // NULL POINTER: change.getPolicy() can return null
          spannerDB.insertPolicy(region, change.getPolicy());
      }
  }
}

Right 👉

public class ServiceControlPolicy {
  private SpannerDatabase spannerDB;
  private QuotaManager quotaManager;
    
  public void applyPolicyChange(PolicyChange change) {
      if (change == null) {
          // Assuming it comes from an external API
          // Beyond your control
          change = new NullPolicyChange();
      }
      
      Policy policy = findPolicyOrNull(change.policyId());
      String quotaField = policy.quotaField();
      if (!quotaField.isEmpty()) {
          quotaManager.updateQuota(quotaField, change.value());
      }
  }
    
  public void exerciseQuotaChecks(String region) {
      if (region == null || region.isEmpty()) {
          // Assuming it comes from an external API
          // Beyond your control
          return;
      }
      
      List<Policy> policies = policiesOrEmpty(region);
      
      for (Policy policy : policies) {
          String quotaValue = policy.quotaField();
          if (!quotaValue.isEmpty()) {
              quotaManager.checkQuota(quotaValue.trim());
          }
      }
  }
    
  public boolean validatePolicyData(Policy policy) {
      if (policy == null) {
          // Assuming it comes from an external API
          // Beyond your control
          // From now on, you wrap it
          policy = new NullPolicy();
      }
      
      String quotaField = policy.quotaField();
      return quotaField.length() > 0;
  }
    
  public void replicateGlobally(PolicyChange change) {
      if (change == null) {
          // Assuming it comes from an external API
          // Beyond your control
          // From now on, you wrap it
          change = new NullPolicyChange();
      }
        
      Policy policy = change.policy();
      if (policy == null) {
          // Assuming it comes from an external API
          // Beyond your control
          // From now on, you wrap it
          policy = new NullPolicy();
      }
        
      List<String> regions = globalRegions();
      for (String region : regions) {
          spannerDB.insertPolicy(region, policy);
      }
  }
    
  private Policy findPolicyOrNull(String policyId) {
      Policy policy = spannerDB.policy(policyId);
      return policy != null ? policy : new NullPolicy();
  }
    
  private List<Policy> policiesOrEmpty(String region) {
      List<Policy> policies = spannerDB.policiesForRegion(region);
      if (policies == null) {
          // This is a good NullObject
          return Collections.emptyList();
      }
      
      return policies.stream()
              .map(p -> p != null ? p : new NullPolicy())
              .collect(Collectors.toList());
  }
}

class NullPolicy extends Policy {
  @Override
  public String quotaField() { return ""; }
    
  @Override
  public String policyId() { return "unknown-policy"; }
    
  @Override
  public Map<String, String> metadata() { 
      return Collections.emptyMap(); 
  }
}

class NullPolicyChange extends PolicyChange {
  @Override
  public String policyId() { return ""; }
    
  @Override
  public String value() { return ""; }
    
  @Override
  public Policy policy() { return new NullPolicy(); }
}

கண்காணிப்பு

  • [x] மொழிபெயர்ப்பு

நீங்கள் Null Check இல்லாத பொருட்களில் Direct Method Calls க்கான குறியீடுகளை ஆய்வு செய்தால் Potential null pointer exceptions can be detected.


Linters க்கான Return Value க்கான Return Value க்கான Return Value க்கான Return Value க்கான Return Value க்கான Return Value க்கான Return Value க்கான Return Value க்கான0 0, uninitialized object fields தேடும், and using static analysis tools that flag potential null dereferences.


இத்தகைய பிரச்சினைகள் எப்போதும் எச்சரிக்கைகளாகக் கருதப்படுகின்றன.

நாள் ️

  • 0 0

நிலைமை

  • [x] இடைவெளியில்

ஏனெனில் பத்து வருடங்கள் கழித்து

அந்நியஉண்மையான உலகம்பொருட்கள் இருக்கின்றன அல்லது இல்லை.


நீங்கள் உங்கள் திட்டத்தில் இதை சரியாக வடிவமைத்தால், நீங்கள் ஒரு தெளிவானOne-to-one பதிவுகள்உண்மை மற்றும் குறியீடு


Null references அனுமதிக்கும் மூலம் இந்த bijection அழித்து, உங்கள் குறியீட்டில் ஆனால் உண்மையான உலகத்தில் இல்லை உள்ள phantom objects உருவாக்குகிறது, நீங்கள் இந்த இல்லாத உள்ளடக்கங்களை தொடர்பு கொள்ள முயற்சிக்கும் போது அழிவுகளை ஏற்படுத்துகிறது.


நீங்கள் உங்கள் கணக்கை "NULL" என்று அழைக்க விரும்பினால், நீங்கள் கிடைக்கும்நிறைய parking tickets

அரண்மனை

AI Generators frequently create code with null pointer vulnerabilities because they focus on happy path scenarios.


அவர்கள் பெரும்பாலும் வழி அழைப்புகளை உருவாக்குகிறார்கள் அங்கு பொருட்கள் இருக்கலாம் என்று அங்கீகரிக்கப்படாமல்.0 0ஆங்கிலத்தில் இதை Single Orgasm, Multiple Orgasm என்றும் கூறுகிறார்கள்.

கண்காணிப்பு

AI tools can detect and fix null pointer problems when you provide clear instructions about defensive programming practices.

முயற்சி செய்யுங்கள்!

நினைவில் கொள்ளுங்கள்: AI Assistants make a lot of mistakes

குறிச்சொற்கள்: Remove all Null References

குறிச்சொற்கள்: Remove all Null References

Without Proper Instructions

With Specific Instructions

ChatGPT

ChatGPT

Claude

Claude

Perplexity

Perplexity

Copilot

Copilot

Gemini

Gemini

DeepSeek

DeepSeek

Meta AI

Meta AI

Grok

Grok

Qwen

Qwen

சைக்கிள்

சைக்கிள்

கிளிக்

கிளிக்

பொறுமை

பொறுமை

குழந்தைகள்

குழந்தைகள்

ஜிமெயில்

ஜிமெயில்

Deep தேடுதல்

Deep தேடுதல்

இலக்கியம் AI

இலக்கியம் AI

கிராமம்

கிராமம்

குமாரன்

குமாரன்

முடிவு

Null pointer exceptions represent one of the most common runtime errors in programming.இதனால், Null pointer exceptions represent one of the most common runtime errors in programming.


நீங்கள் சரியான null சோதனைகளை செயல்படுத்தி, Null Object வடிவமைப்பு மாதிரி பயன்படுத்தி, மற்றும் பாதுகாப்பான திட்டம் செயல்முறைகளை ஏற்க முடியும்.


சிறிய உச்சநீதிமன்ற உறுப்பினர்கள் மற்றும் உச்சநீதிமன்ற உறுப்பினர்கள் மற்றும் உச்சநீதிமன்ற உறுப்பினர்கள்

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-iii-t7h3zkv

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xliii

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxxix

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxvi

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xlii

மேலும் தகவல்

Disclaimer

வாசனைகள் என்நினைவு.


நான் அதை என் பில்லியன் டாலர் தவறு என்று அழைக்கிறேன். அது 1965 இல் zero reference ஐ உருவாக்கப்பட்டது.

நான் அதை என் பில்லியன் டாலர் தவறு என்று அழைக்கிறேன். அது 1965 இல் zero reference ஐ உருவாக்கப்பட்டது.

டாக்டர் ஹீரோ


This article is part of the CodeSmell Series.


L O A D I N G
. . . comments & more!

About Author

Maximiliano Contieri HackerNoon profile picture
Maximiliano Contieri@mcsee
I’m a sr software engineer specialized in Clean Code, Design and TDD Book "Clean Code Cookbook" 500+ articles written

ஹேங் டேக்குகள்

இந்த கட்டுரையில் வழங்கப்பட்டது...

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks