জাভাতে কোন ইন্টি নাল হতে পারে?


155

একটি জাভা intহতে পারে null?

উদাহরণ স্বরূপ:

int data = check(Node root);

if ( data == null ) {
 // do something
} else {
 // do something
}

আমার লক্ষ্য একটি ফাংশন যা একটি ফিরে লিখতে হয় int। বলেছে intএকটি নোডের উচ্চতায় সংরক্ষণ করা হয়েছে, এবং নোডটি উপস্থিত না থাকলে এটি নাল হবে, এবং আমার এটি যাচাই করা দরকার।

আমি এটি হোম ওয়ার্কের জন্য করছি তবে এই নির্দিষ্ট অংশটি হোম ওয়ার্কের অংশ নয়, এটি আমাকে যা করছে তা সবেমাত্র আমাকে সহায়তা করে।

মন্তব্যের জন্য ধন্যবাদ, তবে মনে হচ্ছে খুব কম লোকই কোডের আওতায় আসলে কী পড়েছে, আমি জিজ্ঞাসা করছিলাম যে আমি কীভাবে এই লক্ষ্য অর্জন করতে পারি; এটি কাজ করে না তা নির্ধারণ করা সহজ ছিল।


1
এটি সংকলন সময় ত্রুটি।
মায়ুরবি

উত্তর:


201

int নাল হতে পারে না , তবে Integer পারে । নাল ইন্টিজারগুলি আনবক্স করার সময় আপনার সতর্কতা অবলম্বন করা উচিত কারণ এটি প্রচুর বিভ্রান্তি ও মাথা চুলকতে পারে!

যেমন:

int a = object.getA(); // getA returns a null Integer

NullPointerExceptionবস্তু নাল না হওয়া সত্ত্বেও আপনাকে একটি দেবে !

আপনার প্রশ্নটি অনুসরণ করতে, আপনি যদি কোনও মানটির অনুপস্থিতি নির্দেশ করতে চান তবে আমি তদন্ত করবjava.util.Optional<Integer>


2
পূর্ণাঙ্গ শ্রেণীর অস্তিত্বের ভাল কারণ রয়েছে, তাই যখন প্রয়োজনীয়তা বাধ্য হয় তখন এটি ব্যবহার করুন।
ধন্য গিক

6
@ এইচ 2 জি 2 জাভা: আমি আশা করি আপনি এটি ভাবছেন না যে ডিফল্ট সংগ্রহের সাথে সেগুলি ব্যবহার করতে সক্ষম হবেন বাধ্য কারণ হ্যাশম্যাপ <ইন্টিজার, ইন্টিজার> এর মতো স্টাফগুলির জন্য বর্জ্যের স্তরটি বিশাল এবং অহেতুক। এই কারণেই ট্রভের টিআইটিআইএনটিহ্যাশম্যাপ, কেবল আদিম ব্যবহার করে, অ-বাধ্যকারী হ্যাশম্যাপ <পূর্ণসংখ্যা, পূর্ণসংখ্যক> বৃত্তের চারদিকে চলে।
SyntaxT3rr0r

1
নালটির জন্য ইন্টি পরীক্ষা করা যায় না, তবে আপনি এটি পূর্ণসংখ্যার সাথে জাভায় নালকে নিরাপদে নির্ধারণ করতে পারবেন, উদাহরণস্বরূপ, যদি চেক (রুট) পদ্ধতিটি নাল ফিরে আসতে পারে তবে আপনি নিরাপদে কিছু করার মাধ্যমে ইন্টিতে এটি কাস্ট করতে পারেন এটি: int data = (Integer)check(node);

@ স্যাকটিউ - আপনি কি বিস্তারিত ব্যাখ্যা করতে পারেন? আমি নিশ্চিত না যে আপনি যা পেয়েছেন তা আমি বুঝতে পেরেছি
ব্রায়ান অগ্নিউ

7
@ ব্রায়ান অগ্নি আমাকে এখানে যা বলেছিলাম তা সংশোধন করার জন্য, আমি সাধারণভাবে ভুল ছিলাম, আমি মূলত বুঝতে পারি নি যে এনপিই আনবক্স করার int i = (Integer)null;সময় রান-টাইমে ফেলে দেবে।
12'22 এ স্যাক্টিভ করুন

40

না। কেবলমাত্র অবজেক্টের রেফারেন্সগুলি আদিম নয়, বাতিল হতে পারে।


3
এটি পূর্ণসংখ্যা শ্রেণীর উল্লেখ করা উচিত যা ওপি যদি একটি নাল মান চায় তবে এটি আরও ভাল। অথবা তিনি "পাওয়া যায়নি" ইঙ্গিত করতে নেতিবাচক মান ব্যবহার করতে পারেন
গ্লেন

31

এটির একটি দুর্দান্ত উপায়:

public static void main(String args[]) {
    int i = null;
}

সংকলনের চেষ্টা করুন।


37
আসলে .. ওপি ইতিমধ্যে তার প্রশ্নের শেষ বাক্য অনুযায়ী নিজেকে খুঁজে পেয়েছে: এটি কার্যকর হয় না তা নির্ধারণ করা সহজ ছিল।
বালাসসি

9
উত্তরোত্তর জন্য প্রায় 4 বছর পরে - যে বিট পরে সম্পাদনা ছিল।
ম্যাট লুঙ্গো 21

3
তবে .. Integer ii = null; int i = ii;রচনাটাইমে নালপয়েন্টার এক্সসেপশন সংকলন করে ফেলবে
প্রিমেক.ভ

13

জাভাতে, int একটি আদিম ধরণের এবং এটি কোনও বস্তু হিসাবে বিবেচিত হয় না। শুধুমাত্র অবজেক্টগুলির নাল মান থাকতে পারে। সুতরাং আপনার প্রশ্নের উত্তর না, এটি নালার হতে পারে না। তবে এটি এত সহজ নয়, কারণ এমন কিছু বস্তু রয়েছে যা বেশিরভাগ আদিম ধরণের প্রতিনিধিত্ব করে।

শ্রেণীর পূর্ণসংখ্যা একটি মান মান উপস্থাপন করে তবে এটি নাল মান ধরে রাখতে পারে। আপনার checkপদ্ধতির উপর নির্ভর করে আপনি কোনও ইন্ট বা একটি পূর্ণসংখ্যার ফিরিয়ে দিতে পারেন।

এই আচরণটি রুবির মতো আরও কিছু খাঁটি অবজেক্ট ওরিয়েন্টেড ভাষাগুলির থেকে পৃথক, যেখানে এমনকি "আদিম" জিনিসগুলি ইনটসের মতো বিষয় হিসাবে বিবেচিত হয়।


8

উপরের সমস্ত উত্তরের সাথে আমিও এই পয়েন্টটি যুক্ত করতে চাই।

আদিম ধরণের জন্য, আমরা মেমরির আকার স্থির করে রেখেছি অর্থাত্ আমাদের কাছে 4 বাইট এবং চর রয়েছে আমাদের 2 বাইট। এবং নালটি কেবলমাত্র বস্তুর জন্য ব্যবহৃত হয় কারণ সেখানে মেমরির আকার নির্দিষ্ট করা হয়নি।

সুতরাং ডিফল্টভাবে আমাদের আছে,

   int a=0;

এবং না

   int a=null;

অন্যান্য আদিম ধরণের সাথে একই এবং তাই নাল কেবলমাত্র বস্তুর জন্য ব্যবহৃত হয় আদিম ধরণের জন্য নয়।


5

কোডটিও সংকলন করবে না। শুধুমাত্র একটি পূর্ণ যোগ্য Objectহতে পারে null, মত Integer। আপনি শূন্যতার জন্য পরীক্ষা করতে পারবেন তা এখানে দেখানোর জন্য একটি প্রাথমিক উদাহরণ:

Integer data = check(Node root);

if ( data == null ) {
 // do something
} else {
 // do something
}

অন্যদিকে, যদি check()ফেরার ঘোষণা দেওয়া হয় int, এটি কখনই হতে পারে নাnull এবং পুরো if-elseব্লকটি অতঃপর অতিরিক্ত হয়।

int data = check(Node root);

// do something

সমস্যার Autoboxing এখানে পাশাপাশি প্রযোজ্য নয় যখন check()ফিরে যাওয়ার ঘোষিত হয় int। যদি এটি ফিরে আসে Integer, তবে আপনি NullPointerExceptionএটির intপরিবর্তে এটি নির্ধারণের সময় ঝুঁকি নিতে পারেন Integer। এটিকে অ্যাসাইন Integerকরা এবং if-elseব্লকটি ব্যবহার করা তখন অবশ্যই বাধ্যতামূলক ছিল।

অটোবক্সিং সম্পর্কে আরও জানতে, এই সান গাইডটি দেখুন


1
দুর্ভাগ্যক্রমে যদি "চেক" কোনও পূর্ণসংখ্যার পরিবর্তে কোনও int প্রদান করে, এটি কোনও লাভ করবে না, কারণ int (যা নাল হবে না) স্বয়ংক্রিয়ভাবে পূর্ণসংখ্যায় বক্স হয়ে যাবে।
পল টমলিন

2
দোহ, আপনি কখন শূন্যতার জন্য পরীক্ষা করতে পারবেন তা প্রদর্শন করার জন্য এটি ছিল একটি প্রাথমিক উদাহরণ was অন্যদিকে, যদি চেকটি ফিরতে ঘোষিত হয় তবে intএটি কখনই বাতিল হবে না এবং যদি পুরো ব্লকটি অত্যাবশ্যক হয় তবে পুরোটি কখনই সম্পূর্ণ হতে পারে না।
বালুসসি

3

int iএটি ঘোষণা করার পরিবর্তে ততক্ষণে Integer iআমরা তা করতে পারিi=null;

Integer i;
i=null;

2

পূর্ণসংখ্যার অবজেক্টটি সেরা হবে। আপনি যদি আদিম ব্যবহার করতে পারেন তবে আপনি এমন একটি মান ব্যবহার করতে পারেন যা আপনার ব্যবহারের ক্ষেত্রে বিদ্যমান নেই। নেতিবাচক উচ্চতা মানুষের জন্য বিদ্যমান নেই, তাই

public int getHeight(String name){
    if(map.containsKey(name)){
        return map.get(name);
    }else{
        return -1;
    }
}

1

না, তবে ইনট [] হতে পারে।

int[] hayhay = null; //: allowed (int[] is reference type)
int   hayno  = null; //: error   (int   is primitive type)
                     //: Message: incompatible types: 
                     //: <null> cannot be converted to int

0

@ গ্লেন যেমন একটি মন্তব্যে উল্লেখ করেছেন, আপনার মূলত এটির দুটি উপায় রয়েছে:

  • একটি "আবদ্ধ আউট" মান ব্যবহার করুন। উদাহরণস্বরূপ, যদি "ডেটা" কখনই সাধারণ ব্যবহারে নেতিবাচক হতে না পারে তবে এটি অবৈধ বলে চিহ্নিত করতে নেতিবাচক মানটি ফেরান।
  • একটি পূর্ণসংখ্যা ব্যবহার করুন। কেবলমাত্র "চেক" পদ্ধতিটি কোনও পূর্ণসংখ্যার ফিরিয়ে দেয় তা নিশ্চিত করুন এবং আপনি এটি কোনও পূর্ণসংখ্যার জন্য নয় এটি একটি পূর্ণসংখ্যাতে নির্ধারণ করেন। কারণ কোনও "ইনট" যদি সেই পথে জড়িত হয় তবে স্বয়ংক্রিয় বক্সিং এবং আনবক্সিং সমস্যার কারণ হতে পারে।

0

আপনার চেক () পদ্ধতিতে শূন্যতার জন্য চেক করুন এবং একটি অবৈধ মান যেমন -1 বা শূন্য হলে শূন্য প্রদান করুন। তারপরে চেকটি সেই মানটির জন্য নাল বরাবর পাশ করার পরিবর্তে হবে। পুরানো সময় 'সি' তে এটি করা স্বাভাবিক জিনিস হবে।


0

যে কোনও আদিম ডেটা টাইপ যেমন ইন্ট, বুলিয়ান, বা ভাসমান ইত্যাদি নাল (পার্শ্বীয়) সংরক্ষণ করতে পারে না, যেহেতু জাভা পূর্ণসংখ্যার মতো বুলিয়ান থেকে ইন্টির মতো একই স্টোরের জন্য র্যাপার ক্লাস সরবরাহ করে।

যেমন: পূর্ণসংখ্যা i = নাল;


0

কোন int নাল নয়, আরম্ভ না করা হলে 0 হতে পারে। আপনি যদি কোনও পূর্ণসংখ্যা শূন্য হতে সক্ষম হতে চান তবে আপনাকে ইন্টের পরিবর্তে পূর্ণসংখ্যা ব্যবহার করতে হবে। আদিমদের নাল মান হয় না। ডিফল্ট একটি int জন্য 0 হয়।

ডেটা টাইপ / ডিফল্ট মান (ক্ষেত্রগুলির জন্য)

int ------------------ 0

দীর্ঘ ---------------- 0 এল

ভাসা ---------------- 0.0f

ডাবল ------------- 0.0 ডি

চর --------------- '\ u0000'

স্ট্রিং --------------- নাল

বুলিয়ান ------------ মিথ্যা


-2

যেহেতু আপনি আপনার লক্ষ্যটি অর্জনের জন্য অন্য কোনও উপায়ের জন্য জিজ্ঞাসা করছেন, তাই আমি আপনাকে একটি মোড়কের ক্লাস ব্যবহার করার পরামর্শ দিচ্ছি:

new Integer(null);

-17

আমি কোনও বিশেষজ্ঞ নই, তবে আমি বিশ্বাস করি যে কোনও nullপ্রকারের সমান হয় 0

উদাহরণস্বরূপ, আপনি যদি এটি তৈরি করেন তবে int[]প্রতিটি স্লটে 0বিপরীতে রয়েছে null, যদি না আপনি এটিকে অন্য কোনও কিছুতে সেট করেন।

কিছু পরিস্থিতিতে, এটি কার্যকর হতে পারে।


খুব সহজভাবে, 0 টি নাল হিসাবে একই নয়।
ডেভ গুডচাইল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.