153 ការអាន

Code Smell 304: Null Pointer Exception - តើធ្វើដូចម្តេចដើម្បីកាត់បន្ថយបញ្ជី NULL ដែលធ្វើឱ្យកាត់បន្ថយពេលដំណើរការ

ដោយ Maximiliano Contieri9m2025/06/20
Read on Terminal Reader

យូរ​ពេក; អាន

ការព្យាបាលបញ្ចូល NULL ដែលបង្កើនការកាត់បន្ថយពេលដំណើរការដោយប្រើការត្រួតពិនិត្យត្រឹមត្រូវនិងគំរូសុវត្ថិភាពដោយឥតគិតថ្លៃ
featured image - Code Smell 304: Null Pointer Exception - តើធ្វើដូចម្តេចដើម្បីកាត់បន្ថយបញ្ជី NULL ដែលធ្វើឱ្យកាត់បន្ថយពេលដំណើរការ
Maximiliano Contieri HackerNoon profile picture

ខ្ញុំនឹងសរសេរអំពីបញ្ហា NULL ហើយប៉ុន្តែប្រសិនបើមានបញ្ហា NULL ជាអ្វីដែលខ្ញុំសរសេរនៅពេលបច្ចុប្បន្ននេះខ្ញុំសរសេរនៅពេលបច្ចុប្បន្ននេះ: NULL គឺនៅតែមានជីវិតហើយបាត់បង់។


TL;DR: ការជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយ

TL;DR: ការជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយជួយ

ការបញ្ហានេះ

  • ការកាត់បន្ថយ
  • ការបញ្ហានិងការបញ្ចប់ធំ
  • គោលបំណងគួរឱ្យចាប់អារម្មណ៍
  • ការ debug
  • អ្នកប្រើប្រាស់ Frustration
  • ប្រព័ន្ធភាពធន់ទ្រាំ
  • ការពិតប្រាកដទាប

ក្នុងក្រុមហ៊ុន Google Cloudគំនិត :

  • ការដោះស្រាយបញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាស
  • No Feature Flags: លេខកូដថ្មីមិនត្រូវបានដំឡើងយ៉ាងឆាប់រហ័សជាមួយការត្រួតពិនិត្យសុវត្ថិភាព
  • ការបកប្រែទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំ
  • No Randomized Backoff: ការដោះស្រាយបានធ្វើឱ្យអ៊ីនធឺណិតមានសម្ពាធខ្ពស់
  • ការធ្វើតេស្តមិនត្រឹមត្រូវ: ការធ្វើតេស្តមិនត្រឹមត្រូវមិនត្រូវបានធ្វើតេស្តនៅពេលធ្វើតេស្ត

លក្ខខណ្ឌ

  1. ការពារ nulls
  2. ប្រើការត្រួតពិនិត្យ null ប្រសិនបើ nulls មានការត្រួតពិនិត្យរបស់អ្នក (ឧទាហរណ៍ API បណ្ដាញខាងក្រៅ)
  3. ការចាប់ផ្តើមគុណភាព default
  4. ការអនុវត្តកញ្ចប់ការពារ
  5. ការប្រើប្រាស់ Objects Null
  6. មិនប្រើ Options ។

️ ️ ️

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

លក្ខខណ្ឌ

ខែ មិថុនា 12, 2019 aដំណឹងសំខាន់វាត្រូវបានគេហទំព័រ Google Cloud Platform ។


វាត្រូវបានទាក់ទងនឹងសេវាកម្ម Google Cloud និងសេវាកម្ម Google Workspace នៅទូទាំងពិភពលោកពីប្រហែល 10:49 ល្ងាចទៅ 1:49 ល្ងាច PDT (រយៈពេល 3 ម៉ោងទាំងអស់) ។


ការបាត់បន្ថយនេះត្រូវបានបង្កើតឡើងដោយការបាត់បន្ថយនៅក្នុងប្រព័ន្ធគ្រប់គ្រង API របស់ Google ។


  • នេះជា Trigger:

នៅថ្ងៃទី 29 ខែមិថុនាឆ្នាំ 2025 ក្រុមហ៊ុន Google បានដំឡើងកូដថ្មីទៅក្នុង "ការត្រួតពិនិត្យសេវាកម្ម" (ប្រព័ន្ធគ្រប់គ្រង API របស់ពួកគេ) ដែលបានបន្ថែមការត្រួតពិនិត្យគោលនយោបាយកម្រិតបន្ថែមទៀត។


វាគឺជាកូដដែលមានគុណភាពសំខាន់។ វាគឺជាការគិតថ្លៃគោលបំណងមិនត្រូវបានការពារដោយសៀវភៅ.


  • ការបាត់បង់:

ខែ មិថុនា 12, ការផ្លាស់ប្តូរគោលបំណងដែលមានពណ៌ស /0 0 0នៅពេលដែលការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រងការគ្រប់គ្រង។


  • លទ្ធផលពិភពលោក:

ដោយសារតែការគ្រប់គ្រងកម្រិតនេះគឺជាប្រព័ន្ធគ្រប់គ្រងទូទាំងពិភពលោកទិន្នន័យនេះត្រូវបានចែកចាយនៅទូទាំងពិភពលោកក្នុងរយៈពេល ២ វិនាទីដែលធ្វើឱ្យការគ្រប់គ្រងសេវាកម្មកាត់បន្ថយនៅក្នុងតំបន់ទាំងអស់។


លក្ខខណ្ឌនៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូល។


វាត្រូវបានធ្វើឡើងនៅពេលដែលការផ្លាស់ប្តូររួមមានការផ្លាស់ប្តូរ null вместоការផ្លាស់ប្តូរអតិថិជនដែលមានប្រសិទ្ធិភាព។


ទោះជាយ៉ាងណាក៏ដោយប្រសិនបើបញ្ហានេះមានសុវត្ថិភាពជាពិសេសនៅក្នុងបរិស្ថានផលិតកម្មដែលបញ្ហានេះអាចកាត់បន្ថយកម្មវិធីរបស់អ្នកនិងកាត់បន្ថយអ្នកប្រើ។


ស្លាកដូចជា Java, C# និង JavaScript ជាពិសេសមានភាពងាយស្រួលទៅនឹងបញ្ហានេះប៉ុន្តែលក្ខណៈពិសេសនិងគំរូភាសាច្នៃប្រឌិតអាចជួយអ្នកដោះស្រាយបញ្ហានេះទាំងអស់។


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());
      }
  }
}

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] ដោយស្វ័យប្រវត្តិ

អ្នកអាចរកឃើញការប៉ះពាល់បញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្


Linters អាចស្វែងរកតម្លៃការបង្ហាញពីវិធីដែលអាចបង្ហាញ0 0ការស្វែងរកអេក្រង់អេក្រង់អេក្រង់ដែលមិនត្រូវបានចាប់ផ្តើមនិងប្រើឧបករណ៍វិញ្ញាបនប័ត្រស្ថានដែលមានប្រសិទ្ធិភាពបង្វិល null dereferences ។


អាសយដ្ឋានអ៊ីនធឺណិតច្នៃប្រឌិតច្នៃប្រឌិតច្នៃប្រឌិតច្នៃប្រឌិតច្នៃប្រឌិតច្នៃប្រឌិតច្នៃប្រឌិត។

សត្វ ️

  • 0 0

លក្ខខណ្ឌ

  • [x] ការអភិវឌ្ឍន៍

ហេតុអ្វីវាជាការសំខាន់ ️

នៅក្នុងពិភពលោកពិតសម្ភារៈដែលមានឬមិនមាន។


នៅពេលដែលអ្នករៀបចំនៃការនេះបានត្រឹមត្រូវនៅក្នុងកម្មវិធីរបស់អ្នកអ្នកបង្កើតការបោះឆ្នោត One-to-Oneក្នុងចំណោមការពិតនិងកូដ។


ការបាត់បន្ថយការបាត់បន្ថយនេះដោយអនុញ្ញាតឱ្យគោលបំណងដោយឥតគិតថ្លៃធ្វើឱ្យប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមិនមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមិនមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមិនមានប្រសិនបើមានប្រសិនបើមានប្រ


ប្រសិនបើអ្នកបានជ្រើសរើសឈ្មោះក្លឹបអនុញ្ញាតរបស់អ្នក "NULL" អ្នកនឹងទទួលបានសត្វចិញ្ចឹមជាច្រើន

ម៉ាស៊ីនបង្កើត AI បានបង្កើតកូដជាមួយនឹងការលក្ខខណ្ឌបង្វិលបង្វិលដោយឥតគិតថ្លៃដោយសារតែពួកគេផ្តោតលើប្រសិនបើមានដំណោះស្រាយស្រស់ស្អាត។


ពួកគេជាធម្មតាបង្កើតការហៅប្រព័ន្ធបច្ចេកវិទ្យានេះដោយគ្មានការគណនានៅពេលដែលប្រព័ន្ធផ្សព្វផ្សាយអាចមាន0 0 0លក្ខណៈពិសេសនៅក្នុងការបម្រើអតិថិជនដែលមានលក្ខណៈពិសេសលក្ខណៈពិសេសលក្ខណៈពិសេសលក្ខណៈពិសេសលក្ខណៈពិសេសលក្ខណៈពិសេសលក្ខណៈពិសេសលក្ខណៈពិសេស

ការរកឃើញ

ឧបករណ៍ AI អាចរកឃើញនិងដោះស្រាយបញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាសម្រាប់បញ្ហាស។

ពិនិត្យឡើងវិញ!

សូមអរគុណ: អ្នកជំនួយ AI បានធ្វើទំហំជាច្រើន

គោលបំណង: 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

ហ្វេសប៊ី

ហ្វេសប៊ី

លោក Claude

លោក Claude

ស្លាក

ស្លាក

សាកលវិទ្យាល័យ

សាកលវិទ្យាល័យ

យោបល់

យោបល់

ការស្វែងរក

ការស្វែងរក

គោលបំណង

គោលបំណង

ម្សៅ

ម្សៅ

សត្វ

សត្វ

លក្ខណៈពិសេស

លក្ខខណ្ឌនៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូល។


អ្នកអាចជួសជុលភាគច្រើននៃការកាត់បន្ថយទាំងនេះដោយអនុវត្តការត្រួតពិនិត្យដោយឥតខ្ចោះដោយប្រើគំរូរចនាសម្ព័ន្ធ 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

លក្ខណៈពិសេស

លក្ខខណ្ឌ

គំនូរកូដគឺរបស់ខ្ញុំអារម្មណ៍.


ខ្ញុំនឹងហៅថាវាគឺជាដុល្លារដុល្លាររបស់ខ្ញុំ។ វាគឺជាការច្នៃប្រឌិតនៃការផ្លាស់ប្តូរដោយឥតគិតថ្លៃនៅឆ្នាំ 1965

ខ្ញុំនឹងហៅថាវាគឺជាដុល្លារដុល្លាររបស់ខ្ញុំ។ វាគឺជាការច្នៃប្រឌិតនៃការផ្លាស់ប្តូរដោយឥតគិតថ្លៃនៅឆ្នាំ 1965

លោក Tony ហ្គី


អត្ថបទនេះគឺជាផ្នែកមួយនៃ Series CodeSmell ។


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