জাভাতে ট্রু-ওয়ে সলিউশন: 2 টি স্ট্রিং থেকে 2 সংখ্যা বিশ্লেষণ করুন এবং তার পরে তাদের যোগফলটি দিন return


84

বেশ বোকা প্রশ্ন। কোড দেওয়া:

public static int sum(String a, String b) /* throws? WHAT? */ {
  int x = Integer.parseInt(a); // throws NumberFormatException
  int y = Integer.parseInt(b); // throws NumberFormatException
  return x + y;
}

আপনি বলতে পারেন এটি জাভা ভাল কিনা? আমি যে বিষয়ে কথা বলছি তা NumberFormatExceptionহ'ল একটি চেক করা ব্যতিক্রম। আপনি না থাকে অংশ হিসেবে এটা উল্লেখ করার sum()স্বাক্ষর। অধিকন্তু, আমি যতদূর বুঝতে পেরেছি, পরীক্ষা করা ব্যাতিক্রমের ধারণাটি কেবলমাত্র প্রোগ্রামটির বাস্তবায়নটি ভুল, এবং আরও বেশি কিছু পরীক্ষা করা যায় না, চেক করা ব্যতিক্রমগুলি ধরা একটি খারাপ ধারণা, কারণ এটি রানটাইমের সময় খারাপ প্রোগ্রাম ঠিক করার মতো ।

কেউ দয়া করে পরিষ্কার করবেন কিনা:

  1. NumberFormatExceptionপদ্ধতির স্বাক্ষরের অংশ হিসাবে আমার নির্দিষ্ট করা উচিত ।
  2. আমার নিজের চেক করা ব্যতিক্রম ( BadDataException) সংজ্ঞায়িত করা উচিত , NumberFormatExceptionপদ্ধতির অভ্যন্তরে হ্যান্ডেল করা উচিত এবং এটিকে আবার নিক্ষেপ করা উচিত BadDataException
  3. আমার নিজের চেক করা ব্যতিক্রম ( BadDataException) সংজ্ঞায়িত করা উচিত , নিয়মিত অভিব্যক্তির মতো উভয় স্ট্রিংকে বৈধতা দিন এবং BadDataExceptionএটি মেলে না তবে আমার নিক্ষেপ করা উচিত।
  4. আপনার ধারণা?

আপডেট :

ভাবুন, এটি কোনও মুক্ত-উত্স কাঠামো নয়, যা আপনার কোনও কারণে ব্যবহার করা উচিত। আপনি পদ্ধতির স্বাক্ষরটি দেখুন এবং ভাবেন - "ঠিক আছে, এটি কখনই ছুড়ে না"। তারপরে, কোনও দিন, আপনি একটি ব্যতিক্রম পেয়েছিলেন। এটা কি স্বাভাবিক?

আপডেট 2 :

আমার মন্তব্য sum(String, String)একটি খারাপ নকশা বলে কিছু মন্তব্য আছে । আমি একেবারে একমত, তবে যারা বিশ্বাস করেন যে আমাদের ভাল ডিজাইন থাকলে মূল সমস্যাটি কখনই উপস্থিত হবে না, এখানে একটি অতিরিক্ত প্রশ্ন রয়েছে:

সমস্যার সংজ্ঞাটি এরকম: আপনার কাছে একটি ডেটা উত্স রয়েছে যেখানে সংখ্যা Stringগুলি হিসাবে সংরক্ষণ করা হয় । এই উত্সটি এক্সএমএল ফাইল, ওয়েব পৃষ্ঠা, ডেস্কটপ উইন্ডোতে 2 টি সম্পাদনা বাক্সের সাথে যাই হোক না কেন থাকতে পারে।

আপনার লক্ষ্য হ'ল এই যুক্তিকে বাস্তবায়ন করা যা এই 2 Stringটি গ্রহণ করে, সেগুলিতে রূপান্তর করে intএবং "যোগফলটি xxx" বলে বার্তা বাক্স প্রদর্শন করে message

আপনি এটি নকশা / বাস্তবায়নের জন্য কী পদ্ধতির ব্যবহার করেন তা বিচার্য নয়, আপনার অভ্যন্তরীণ কার্যকারিতার এই 2 পয়েন্ট থাকবে :

  1. এমন কোনও জায়গা যেখানে আপনি রূপান্তর Stringকরেছেনint
  2. এমন একটি জায়গা যেখানে আপনি 2 intটি যুক্ত করেন

আমার মূল পোস্টের প্রাথমিক প্রশ্নটি হ'ল:

Integer.parseInt()সঠিক স্ট্রিং উত্তীর্ণ হওয়ার প্রত্যাশা করে । আপনি যখনই কোনও খারাপ স্ট্রিংটি পাস করেন , তার অর্থ হল আপনার প্রোগ্রামটি ভুল (" আপনার ব্যবহারকারী একজন নির্বোধ" নয়)। আপনাকে কোডের টুকরোটি বাস্তবায়ন করতে হবে যেখানে একদিকে আপনার মুখ্য শব্দার্থবিজ্ঞানের সাথে Integer.parseInt () থাকে এবং অন্যদিকে ইনপুটটি ভুল হলে আপনাকে কেসগুলি ঠিক করতে হবে - শব্দার্থক শব্দাবলীর কথা বলা উচিত

সুতরাং, সংক্ষেপে: আমার কাছে কেবলমাত্র লাইব্রেরি থাকলে আমি কীভাবে শব্দার্থক প্রয়োগ করব ।


13
এটি কোনওভাবেই বোকা প্রশ্ন নয়। আসলে এটি বেশ ভাল! আমি পুরোপুরি নিশ্চিত নই, আমি কোন বিকল্পটি বেছে নেব।
মার্টিন

4
আপনার আপডেটের জন্য: হ্যাঁ, ব্যর্থ-দ্রুত নীতি অনুসারে এটি অকারণে খারাপ জিনিসও হবে না।
জোহান সিজবার্গ

4
আমি মার্টিনের সাথে একমত এটি জাভা প্রোগ্রামিংয়ের অন্যতম দিক যা কমপক্ষে বোঝা যায় যার জন্য কয়েকটি সেরা অনুশীলনের প্রয়োজন। এই বিষয়টিতে পৃষ্ঠাগুলির অভাব খুব বেশি সংখ্যক ও'রেইলি "এইভাবে এটি করা উচিত" এই কথাটি ছাড়াও দেখা যায়।
জেমস পি।

4
আসলে, এটি একটি দুর্দান্ত প্রশ্ন।
ক্রিস চুদমোর

4
দুর্দান্ত প্রশ্ন! কিছু দুর্দান্ত উত্তরও উত্থাপন করেছে: ডি
খেলাদার

উত্তর:


35

এটা একটা ভালো প্রশ্ন। আমি আশা করি আরও বেশি লোক এই জাতীয় বিষয়গুলি নিয়ে ভাবুক।

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

সাধারণভাবে বলতে গেলে, আপনার ফেলে দেওয়া উচিত নয় BadDataExceptionকারণ আপনার প্রোগ্রাম প্রবাহ নিয়ন্ত্রণ করতে ব্যতিক্রমগুলি ব্যবহার করা উচিত নয়। ব্যতিক্রম ব্যতিক্রমগুলি। আপনার পদ্ধতিতে কলকারীরা তাদের স্ট্রিং সংখ্যা বা না থাকলে এটির কল করার আগে তারা জানতে পারবেন , সুতরাং আবর্জনা কাটিয়ে তোলা এড়ানো যায় এবং তাই প্রোগ্রামিং ত্রুটি হিসাবে বিবেচনা করা যেতে পারে , যার অর্থ চেক করা ব্যতিক্রমগুলি ছুঁড়ে দেওয়া ঠিক আছে।

ঘোষণার বিষয়ে throws NumberFormatException- এটি ততটা কার্যকর নয়, কারণ সংখ্যার ফরম্যাটএক্সসেপশনটি চেক করা না থাকার কারণে কয়েকজন লক্ষ্য করবেন। তবে আইডিই এর ব্যবহার করতে পারে এবং try/catchসঠিকভাবে মোড়ানোর প্রস্তাব দিতে পারে । একটি ভাল বিকল্প হ'ল জাভাডক ব্যবহার করা, যেমন:

/**
 * Adds two string numbers
 * @param a
 * @param b
 * @return
 * @throws NumberFormatException if either of a or b is not an integer
 */
public static int sum(String a, String b) throws NumberFormatException {
    int x = Integer.parseInt(a); 
    int y = Integer.parseInt(b); 
    return x + y;
}

সম্পাদিত :
মন্তব্যকারীরা বৈধ পয়েন্ট করেছেন। এটি কীভাবে ব্যবহৃত হবে এবং আপনার অ্যাপের সামগ্রিক নকশা বিবেচনা করা উচিত to

যদি পদ্ধতিটি পুরো জায়গা জুড়ে ব্যবহার করা হবে, এবং এটি গুরুত্বপূর্ণ যে সমস্ত কলাররা সমস্যাগুলি পরিচালনা করেন তবে পদ্ধতিটিকে একটি পরীক্ষিত ব্যতিক্রম (কলারদেরকে সমস্যা মোকাবেলা করতে বাধ্য করা) নিক্ষেপ হিসাবে ঘোষণা করুন, তবে কোডগুলি try/catchব্লকগুলি দিয়ে বিশৃঙ্খলাবদ্ধ ।

অন্যদিকে আমরা যদি আমাদের বিশ্বাসের ডেটা সহ এই পদ্ধতিটি ব্যবহার করি, তবে এটি উপরের হিসাবে ঘোষণা করুন, কারণ এটি কখনও বিস্ফোরিত হবে না এবং আপনি অপ্রয়োজনীয় try/catchব্লকগুলির কোড গণ্ডগোলটি এড়ান ।


6
সমস্যাটি হ'ল চেক করা ব্যতিক্রমগুলি প্রায়শই উপেক্ষা করা হয় এবং আপনার কল স্ট্যাকটি সজ্জিত করে, আপনার অ্যাপ্লিকেশনের এমন কিছু অংশে ধ্বংসস্তূপ ডেকে আনতে পারে যা নীচের অংশে কোন ধারণা নেই। প্রশ্নটি আসলে কী বিটের কোডটি ইনপুটটি বৈধ কিনা তা পরীক্ষা করা উচিত।
জিএইচএইচ

4
@ জিএইচএইচ পয়েন্ট রয়েছে। জাভা টিউটোরিয়ালগুলি এ বলেছে: "যদি কোনও ক্লায়েন্ট যদি ব্যতিক্রম থেকে সুস্থ হয়ে উঠার প্রত্যাশা করতে পারে তবে এটি একটি চেক করা ব্যতিক্রম করুন a যদি কোনও ক্লায়েন্ট ব্যতিক্রম থেকে পুনরুদ্ধার করতে কিছু করতে না পারে, তবে এটি একটি চেক করা ব্যতিক্রম করুন"। প্রশ্নটি হ'ল কোথায় RuntimeExceptionপরিচালনা করা উচিত ? এটি কলকারী হওয়া উচিত বা ব্যতিক্রমটি ভেসে উঠতে হবে? যদি তাই হয় কিভাবে এটি পরিচালনা করা উচিত?
জেমস পি।

4
আংশিকভাবে এর উত্তর দিতে আমি এখানে দুটি পন্থা দেখেছি: প্রথমটি হ'ল Exceptionsনিম্ন স্তরগুলি থেকে বিরত থাকা এবং তাদের উচ্চ স্তরের ব্যতিক্রমগুলি অন্তর্ভুক্ত করা উচিত যা শেষ ব্যবহারকারীর কাছে আরও অর্থবহ এবং দ্বিতীয়টি হল একটি অবিকৃত ব্যতিক্রম হ্যান্ডলার ব্যবহার করা যা এতে আরম্ভ করা যেতে পারে use অ্যাপ্লিকেশন প্রবর্তক
জেমস পি।

4
জাভাডকটিতে আইএমএইচওর নাম্বার ফর্ম্যাট এক্সপ্লেশনটি অনেক বেশি গুরুত্বপূর্ণ। এটিকে throwsক্লজে রেখে দেওয়া একটি দুর্দান্ত সংযোজন, তবে প্রয়োজন নেই।
ডোরাস

4
করতে "আপনার পদ্ধতি কল করা জানতে পারেন আগে তারা একে ডাকতে যদি তাদের স্ট্রিং সংখ্যা বা নয়, তাই ক্ষণস্থায়ী আবর্জনা পরিহার্য হয়" : যে সত্যিই সত্য নয়। কোন স্ট্রিংটিকে ইন্ট হিসাবে বিভক্ত করে তা যাচাই করার একমাত্র সহজ উপায়। যদিও আপনি কিছু সামনের চেক করতে চাইতে পারেন, সঠিক চেকিং বেশ একটি পিটা is
maarartinus

49

আমার মতে ব্যতিক্রম যুক্তি যথাসম্ভব পরিচালনা করা ভাল be সুতরাং আমি স্বাক্ষর পছন্দ করব

 public static int sum(int a, int b);

আপনার পদ্ধতির স্বাক্ষর দিয়ে আমি কোনও পরিবর্তন করব না । হয় আপনি হয়

  • প্রোগ্রামগতভাবে ভুল মানগুলি ব্যবহার করে, যেখানে আপনি পরিবর্তে আপনার প্রযোজকের অ্যালগরিদমকে বৈধতা দিতে পারেন
  • অথবা উদাহরণস্বরূপ, ব্যবহারকারী ইনপুট থেকে মান প্রেরণ, সেই ক্ষেত্রে সেই মডিউলটি বৈধতা সম্পাদন করবে

সুতরাং, এই ক্ষেত্রে ব্যতিক্রম হ্যান্ডলিং একটি ডকুমেন্টেশন ইস্যুতে পরিণত হয়।


4
আমি এই পছন্দ। এটি ব্যবহারকারীকে চুক্তি অনুসরণ করতে বাধ্য করে এবং পদ্ধতিটি কেবল একটি কাজ করে।
ক্রিস চুদমোর

আমি বুঝতে পারি না যে এই পদ্ধতির ব্যবহারটি কীভাবে + বি তৈরির চেয়ে আলাদা different আমাদের এই পদ্ধতিটি কেন প্রয়োজন?
সোয়াতি

4
@ সোয়াতি: আমি মনে করি এটি একটি উদাহরণ , যা জিনিসকে সহজভাবে দেখানোর জন্য দুর্দান্ত কৌশল। যোগফলটি একইসাথে মাইভ্যুরিসিপলটেড মেথডউইচকম্পিউটসফোন নাম্বারফফমাইআইডিয়াল ম্যাচগার্ল (ইন্ট মাইআইডি, মাইলাইফ এক্সপেক্সটেন্সি) হতে পারে ...
খেলদার

4
পুরোপুরি এখানে একমত। একটি sumফাংশন যা দুটি সংখ্যা আশা করে, দুটি সংখ্যা পাওয়া উচিত। আপনি যেভাবে এটি পেয়েছেন সেটি sumফাংশনের সাথে সম্পর্কিত নয় । আপনার যুক্তি সঠিকভাবে পৃথক করুন । সুতরাং, আমি এটি একটি ডিজাইনের সমস্যার সাথে যুক্ত করব।
c00kiemon5ter

5

সংখ্যা ৪. যেমন দেওয়া হয়েছে, এই পদ্ধতিতে স্ট্রিংগুলি পরামিতি হিসাবে নেওয়া উচিত নয় এটির পূর্ণসংখ্যার হওয়া উচিত। যে ক্ষেত্রে (যেহেতু জাভা উপচে পড়ার পরিবর্তে মোড়ানো) তার ব্যতিক্রম হওয়ার সম্ভাবনা নেই।

 x = sum(Integer.parseInt(a), Integer.parseInt(b))

এর চেয়ে কী বোঝানো হয়েছে তা অনেক পরিষ্কার x = sum(a, b)

আপনি ব্যতিক্রমটি যতটা সম্ভব উত্স (ইনপুট) এর কাছাকাছি ঘটতে চান।

৩-৪ বিকল্প হিসাবে, আপনি একটি ব্যতিক্রম সংজ্ঞায়িত করেননি কারণ আপনি কলকারীদের ধরে নিয়েছেন বলে মনে করেন যে অন্যথায় আপনার কোডটি ব্যর্থ হতে পারে না, আপনি আপনার ব্যর্থতার ক্ষেত্রে অদ্বিতীয় যা জ্ঞাত ব্যর্থতার শর্তে কী ঘটে তা সংজ্ঞায়িত করার জন্য একটি ব্যতিক্রম সংজ্ঞায়িত করেন। উদাহরণস্বরূপ, যদি আপনার এমন কোনও পদ্ধতি থাকে যা অন্য কোনও অবজেক্টের চারপাশে মোড়ক এবং এটি একটি ব্যতিক্রম ছুঁড়ে দেয় তবে এটি পাশ দিয়ে দিন। ব্যতিক্রমটি যদি আপনার পদ্ধতির সাথে স্বতন্ত্র থাকে তবে আপনি যদি কেবল একটি কাস্টম ব্যতিক্রম ছোঁড়াতে পারেন (ফ্রেক্স, উদাহরণস্বরূপ, যদি যোগফলটি কেবল ইতিবাচক ফলাফল ফেরত নিয়ে আসে তবে তার জন্য পরীক্ষা করা এবং একটি ব্যতিক্রম ছুঁড়ে দেওয়া উপযুক্ত হবে, যদি অন্যদিকে জাভা হয় মোড়কের পরিবর্তে একটি ওভারফ্লো ব্যতিক্রম ছুঁড়ে ফেলেছে, তারপরে আপনি এটি পাস করবেন, আপনার স্বাক্ষরে এটি সংজ্ঞায়িত করবেন না, নাম পরিবর্তন করবেন বা এটি খান)।

প্রশ্নের আপডেটের জবাবে আপডেট করুন:

সুতরাং, সংক্ষেপে: আমি কেবলমাত্র লাইব্রেরি থাকতে পারলে কীভাবে শব্দার্থক প্রয়োগ করব।

এর সমাধান হ'ল মুস লাইব্রেরিটি মোড়ানো, এবং একটি শুল্ক মান ফিরিয়ে দেওয়া। এই ক্ষেত্রে, একটি ফাংশন যা একটি পূর্ণসংখ্যা ফেরত দেয়। একটি ফাংশন লিখুন যা একটি স্ট্রিং নেয় এবং একটি পূর্ণসংখ্যার অবজেক্ট ফেরত দেয় - হয় এটি কাজ করে, অথবা এটি শূন্যরূপে ফিরে আসে (পেয়ারার ইনস.ট্রি পার্সের মতো)। আপনার অপারেশন থেকে আপনার বৈধতা পৃথক করুন, আপনার অপারেশন ইনট নেওয়া উচিত take আপনার অকার্যকর ইনপুট থাকাকালীন আপনার অপারেশনটি ডিফল্ট মানগুলির সাথে ডেকে আনা হয়েছে বা আপনি অন্য কিছু করেন কিনা তা আপনার চশমার উপর নির্ভর করে - বেশিরভাগই আমি এ সম্পর্কে বলতে পারি, সিদ্ধান্তটি গ্রহণের জায়গাটি অপারেশনটিতে আসার সম্ভাবনা খুব কম Whether পদ্ধতি


এখানে আপনার ধারণা কি? আমি একই সমস্যা এমনকি যদি আমি পেতে করত sum(int, int)এবং parseIntFromString(String)। একই কার্যকারিতা পেতে, উভয় ক্ষেত্রেই, আমাকে একটি কোডের টুকরো লিখতে হবে যেখানে 2 টি কল parseIntFromString()এবং 1 টি কল রয়েছে sum()। এই ক্ষেত্রেটি বিবেচনা করুন, যদি এটি আপনার পক্ষে বোঝায় - আমি মূল সমস্যার অবস্থান থেকে কোনও পার্থক্য দেখি না।
আন্দ্রে আগিবালোভ

@ লকি ২৩০২: পয়েন্টটি কলকারী তখন কোনও সংখ্যা না হলে কোন আচরণের পক্ষে উপযুক্ত তা সিদ্ধান্ত নিতে পারে। এছাড়াও, যদি তারা ত্রুটি পরীক্ষা করে ত্রুটি না করে তবে ব্যর্থতাটি যেখানে মূল্য নির্ধারিত হয় তার এক ধাপের কাছাকাছি সময়ে ঘটে - ডিবাগিংয়ের উদ্দেশ্যে, অ্যাসাইনমেন্টের কাছাকাছি, ডিবাগিং তত সহজ। আপনি যদি টিডিডি করে থাকেন তবে কলারের জন্য উপযুক্ত ইউনিট পরীক্ষা লেখাটি মিস করার সম্ভাবনা আপনার পক্ষে বেশি। মূলত আপনি মেথড x তে একটি স্ট্রিং সরবরাহ করতে চান না যা একটি সংখ্যা বলে মনে করা হয় এবং তারপরে 5 টি ক্লাস এবং 20 পদ্ধতি কলগুলি যখন একটি সংখ্যার সাথে চিকিত্সা করার চেষ্টা করেন তখন একটি ব্যতিক্রম ছুঁড়ে দেয়।
jmoreno

আমি পাই না। আপনি কি বলার চেষ্টা করছেন যে কোনও ইন্টারফেস সরবরাহ int sum(String, String)করা বাস্তবে কখনও সম্ভব হয় না?
আন্দ্রে আগিবালভ

4
@ loki2302: দেখানো কোড দেওয়া, এটি সম্ভব হবে তবে একটি খারাপ ধারণা। যদি স্ট্রিংয়ের সংখ্যাটি এমন একটি শব্দ হতে পারে যেখানে "2", "দুটি", "ডস", "ডিউস", "জডউউ" সমস্ত একই আচরণ করা হত, তবে সেই স্বাক্ষরটি যথাযথ হবে। তবে যেমনটি হয়, পদ্ধতিটিকে দুটি স্ট্রিং দেওয়া হয় এবং তাদের পূর্ণসংখ্যার হিসাবে বিবেচনা করে। আপনি কি কখনও এটি করতে চান? এটি একটি খারাপ ধারণা।
jmoreno

4
@ লকি ২৩০২: আপনি জবাবটি গ্রহণ করে বলেছিলেন যে আবর্জনা পাস করার সময় একটি চেক করা ব্যতিক্রম ছুঁড়ে দেওয়া ঠিক ছিল, তবে দৃ strongly়ভাবে টাইপিত ভাষার মূল বিষয়টি আবর্জনা কাটিয়ে যাওয়া থেকে রক্ষা করা। একটি স্ট্রিং সর্বদা পূর্ণসংখ্যার মান হিসাবে প্রত্যাশা করে এমন একটি পদ্ধতি থাকা কেবল সমস্যা জিজ্ঞাসা করছে। এমনকি Integer.parseInt এটি ভালভাবে মোকাবেলা করে না (যা প্রত্যাশিত ইনপুটটি প্রত্যাশা করা উচিত তার ব্যতিক্রমটি খারাপ।
jmoreno

3

1. পদ্ধতির স্বাক্ষরের একটি অংশ হিসাবে আমার নাম্বার ফর্ম্যাট এক্সপ্লেশন নির্দিষ্ট করা উচিত।

আমি তাই মনে করি. এটি একটি দুর্দান্ত ডকুমেন্টেশন।

২. আমার নিজের চেক করা ব্যতিক্রম (BadDataException) সংজ্ঞায়িত করা উচিত, পদ্ধতির অভ্যন্তরে নাম্বার ফর্মএক্সসেপশন হ্যান্ডেল করা উচিত এবং এটিকে BadDataException হিসাবে আবার ছুঁড়ে ফেলা উচিত।

কখনও কখনও হ্যাঁ. চেক করা ব্যতিক্রমগুলি কিছু ক্ষেত্রে আরও ভাল হিসাবে বিবেচিত হয় তবে তাদের সাথে কাজ করা বেশ পিআইটিএ। এজন্য অনেকগুলি ফ্রেমওয়ার্ক (যেমন হাইবারনেট) কেবল রানটাইম ব্যতিক্রম ব্যবহার করে।

৩. আমার নিজের চেক করা ব্যতিক্রম (BadDataException) সংজ্ঞায়িত করা উচিত, নিয়মিত এক্সপ্রেশনগুলির মতো উভয় স্ট্রিংকে কোনওভাবেই বৈধতা দিন এবং এটি মেলে না, তবে আমার BadDataException নিক্ষেপ করুন।

কখনই না। আরও কাজ, কম গতি (যদি আপনি ব্যতিক্রমটি কোনও নিয়ম হিসাবে ছুঁড়ে ফেলার আশা না করেন) এবং কোনও লাভ হয় না।

4. আপনার ধারণা?

কিছুই না।


2

এনআর 4।

আমি মনে করি আমি পদ্ধতিটি একেবারেই পরিবর্তন করব না। আমি কল করার পদ্ধতিটি বা তার চেয়েও বেশি স্ট্যাক ট্রেসটিতে চেষ্টা করব যেখানে আমি এমন একটি প্রসঙ্গে আছি যেখানে আমি ব্যতিক্রম থেকে ব্যবসায়িক যুক্তি দিয়ে সুকৌশলে পুনরুদ্ধার করতে পারি।

আমি ওভারকিল হিসাবে বিবেচনা করায় আমি নিশ্চিতভাবে # 3 করব না।


2

ধরে নিচ্ছি যে আপনি যা লিখছেন তা অন্য কারও দ্বারা গ্রাস করা হবে (যেমন একটি এপিআই হিসাবে) তবে আপনার 1 টির সাথে চলতে হবে, নাম্বার ফর্ম্যাট এক্সেকশনটি বিশেষত এই জাতীয় ব্যতিক্রমগুলির যোগাযোগের উদ্দেশ্যে এবং এটি ব্যবহার করা উচিত।


2
  1. প্রথমে আপনাকে নিজের থেকে জিজ্ঞাসা করা দরকার, আমার পদ্ধতির ব্যবহারকারীর কি ভুল ডেটা প্রবেশের বিষয়ে চিন্তা করা দরকার, বা তার কাছে সঠিক ডেটা প্রবেশ করার আশা করা হচ্ছে (এই ক্ষেত্রে স্ট্রিং)। এই প্রত্যাশাটি চুক্তি অনুসারে ডিজাইন হিসাবেও জানে ।

  2. এবং ৩ হ্যাঁ আপনার সম্ভবত ব্যাডটাটা এক্সেপশন সংজ্ঞায়িত করা উচিত বা নাম ফোরমেট এক্সেপশন এর মতো কিছু এক্সাইজিং প্লে ব্যবহার করা উচিত বরং স্ট্যান্ডার্ড বার্তাটি প্রদর্শন করার জন্য রেখে দেওয়া উচিত। পদ্ধতিতে নাম্বার ফর্ম্যাট এক্সেকশনটি ধরুন এবং এটি আপনার বার্তার সাথে আবার ছুঁড়ে ফেলুন, মূল স্ট্যাক ট্রেস অন্তর্ভুক্ত করতে ভুলে যাবেন না।

  3. এটি পরিস্থিতি বুটির উপর নির্ভর করে আমি সম্ভবত কিছু অতিরিক্ত তথ্যের সাথে আবার নাম্বার ফর্ম্যাট এক্সেকশন দিয়ে যাব। এবং প্রত্যাশিত মানগুলি কী কী তা সম্পর্কে একটি জ্যাভডোক ব্যাখ্যা অবশ্যই থাকতে হবেString a, String b


1

আপনি যে দৃশ্যে আছেন তাতে অনেকটা নির্ভর করে।

কেস 1. এটি সর্বদা আপনি কোডটি ডিবাগ করেন এবং অন্য কেউ এবং ব্যতিক্রম খারাপ ব্যবহারকারীর অভিজ্ঞতার কারণ হয় না

ডিফল্ট নম্বর ফোরামএক্সসেপশন নিক্ষেপ করুন

কেস 2: কোডটি অত্যন্ত রক্ষণাবেক্ষণযোগ্য এবং বোধগম্য হওয়া উচিত

আপনার নিজস্ব ব্যতিক্রম সংজ্ঞা দিন এবং এটি নিক্ষেপ করার সময় ডিবাগিংয়ের জন্য আরও অনেক ডেটা যুক্ত করুন।

আপনার যেমন রেগেক্স চেকের দরকার নেই, এটি যাইহোক খারাপ ইনপুটটিতে ব্যতিক্রম হতে পারে।

যদি এটি একটি প্রোডাকশন লেভেল কোড হয় তবে আমার ধারণাটি হ'ল একের অধিক কাস্টম ব্যতিক্রম সংজ্ঞায়িত করা

  1. সংখ্যা বিন্যাস ব্যতিক্রম
  2. ওভারফ্লো ব্যতিক্রম
  3. নাল ব্যতিক্রম ইত্যাদি ...

এবং এগুলি সমস্ত আলাদাভাবে মোকাবেলা করুন


1
  1. আপনি এটি করতে পারেন, এটি পরিষ্কার করার জন্য যে এটি ভুল ইনপুটটির জন্য ঘটতে পারে। এটি আপনার কোড ব্যবহার করে এমন কাউকে এই পরিস্থিতিটি পরিচালনা করতে মনে রাখতে সহায়তা করতে পারে। আরও সুনির্দিষ্টভাবে, আপনি এটি পরিষ্কার করে দিচ্ছেন যে আপনি নিজেরাই কোডটিতে এটি পরিচালনা করেন না, বা পরিবর্তে কিছু নির্দিষ্ট মান ফেরান। অবশ্যই, জাভাডকেরও এটি পরিষ্কার করা উচিত।
  2. আপনি যদি কলকারীকে চেক করা ব্যতিক্রম নিয়ে কাজ করতে বাধ্য করতে চান তবেই।
  3. ওভারকিলের মতো মনে হচ্ছে। খারাপ ইনপুট সনাক্ত করতে পার্সিংয়ের উপর নির্ভর করুন।

ওভারাল, একটি নাম্বারফর্ম্যাক্সেশনটি চেক করা হয়নি কারণ এটি প্রত্যাশিত যে সঠিকভাবে পার্সেবল ইনপুট সরবরাহ করা হয়েছে। ইনপুট বৈধতা এমন কিছু যা আপনার পরিচালনা করা উচিত। তবে, প্রকৃতপক্ষে ইনপুটটি পার্সিং করা এটি করার সহজতম উপায়। আপনার পদ্ধতিটি যেমন হয় তেমনই আপনি ছেড়ে দিতে পারেন এবং ডকুমেন্টেশনে সতর্ক করে দিয়েছিলেন যে সঠিক ইনপুটটি প্রত্যাশিত এবং আপনার ফাংশনটিতে যে কেউ ফোন করবেন এটি ব্যবহারের আগে উভয় ইনপুট বৈধ করে তুলবেন।


1

কোন ব্যতিক্রমী আচরণ ডকুমেন্টেশনে স্পষ্ট করা উচিত। হয় এটি উল্লেখ করা উচিত যে ব্যর্থতার ক্ষেত্রে (যেমন null, রিটার্নের ধরণটি পরিবর্তন করে Integer) বা কেস 1 ব্যবহার করার ক্ষেত্রে এই পদ্ধতিটি একটি বিশেষ মান প্রদান করে । পদ্ধতির স্বাক্ষরে এটিকে স্পষ্ট করে দেওয়া ব্যবহারকারীর অন্য উপায়ে সঠিক স্ট্রিংগুলি নিশ্চিত করার ক্ষেত্রে এটি এড়িয়ে যাওয়ার সুযোগ দেয়, তবে এটি এখনও স্পষ্ট যে পদ্ধতিটি এই ধরণের ব্যর্থতা নিজেই পরিচালনা করে না।


1

আপনার আপডেট করা প্রশ্নের উত্তর।

হ্যাঁ "আশ্চর্য" ব্যতিক্রমগুলি পাওয়া একেবারে স্বাভাবিক। প্রোগ্রামিংয়ে নতুন হওয়ার সময় যে সমস্ত রান টাইম ত্রুটি পেয়েছিল সেগুলি সম্পর্কে ভাবুন।

e.g ArrayIndexOutofBound

প্রতিটি লুপের জন্য একটি সাধারণ চমক ব্যতিক্রম।

ConcurrentModificationException or something like that

1

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

"কল্পনা করুন, এটি কোনও ওপেন-সোর্স কাঠামো নয়, যে কোনও কারণে আপনার ব্যবহার করা উচিত question প্রশ্নটির আপডেট সম্পর্কে method আপনি পদ্ধতির স্বাক্ষরটি দেখে মনে করেন -" ঠিক আছে, এটি কখনই ছুড়ে দেয় না "Then তারপরে, কিছুদিন, আপনি একটি ব্যতিক্রম পেয়েছিলেন . এটা কি স্বাভাবিক?" আপনার পদ্ধতির জাভাডোক সর্বদা আপনার পদ্ধতির আচরণ ছড়িয়ে দেওয়া উচিত (প্রাক এবং পোস্ট সীমাবদ্ধতা)। কালেকশন ইন্টারফেসের লাইনে চিন্তা করুন যেখানে কোনও নালকে মঞ্জুরিপ্রাপ্ত না হলে জাভাদোক বলে যে নাল পয়েন্টার ব্যতিক্রম নিক্ষেপ করা হবে যদিও এটি কখনও পদ্ধতির স্বাক্ষরের অংশ নয়।


4
নাম্বার ফর্ম্যাটেক্সেপশন হ'ল ইলিজালআরগমেন্টএক্সেপশন এর একটি উপশ্রেণী, সুতরাং এই মোড়ানো কোন তথ্য যোগ করে না।
ডন রবি

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

1

আপনি যেমন ভাল জাভা অনুশীলনের কথা বলছেন, আমার মতে এটি সর্বদা ভাল

  • চেক না করা ব্যতিক্রম হ্যান্ডেল করার জন্য এটি বিশ্লেষণ করুন এবং একটি কাস্টম চেক করা ব্যতিক্রমের মাধ্যমে।

  • এছাড়াও কাস্টম চেক করা ব্যতিক্রম ছোঁড়ার সময় আপনি ব্যতিক্রম বার্তাটি যুক্ত করতে পারেন যা আপনার ক্লায়েন্ট বুঝতে পারে এবং মূল ব্যতিক্রমের স্ট্যাক ট্রেসটি মুদ্রণ করতে পারে

  • কাস্টম ব্যতিক্রমটিকে "ছোঁড়া" হিসাবে ঘোষণা করার দরকার নেই কারণ এটি চেক করা হয়নি।

  • এইভাবে আপনি যাচাই করা ব্যতিক্রমগুলি কীভাবে ব্যবহার করা হচ্ছে তা ব্যবহারের লঙ্ঘন করছেন না, একই সাথে কোডের ক্লায়েন্ট সহজেই ব্যতিক্রমটির কারণ এবং সমাধান বুঝতে পারে।

  • এছাড়াও জাভা-ডকে সঠিকভাবে ডকুমেন্টিং করা একটি ভাল অনুশীলন এবং অনেক সাহায্য করে।


1

আমি মনে করি এটি আপনার উদ্দেশ্যের উপর নির্ভর করে তবে আমি এটি নূন্যতমে নথিভুক্ত করব:

/**
 * @return the sum (as an int) of the two strings
 * @throws NumberFormatException if either string can't be converted to an Integer
 */
public static int sum(String a, String b)
  int x = Integer.parseInt(a);
  int y = Integer.parseInt(b);
  return x + y;
}

অথবা, জাভা.এল.আংটিজার শ্রেণীর জন্য জাভা উত্স কোড থেকে একটি পৃষ্ঠা নিন:

public static int parseInt(java.lang.String string) throws java.lang.NumberFormatException;

1

গুগলের 'পেয়ারা' গ্রন্থাগার বা অ্যাপাচের 'ভ্যালিডেটর' গ্রন্থাগার ( তুলনা) দ্বারা প্রয়োগ করা ইনপুট বৈধকরণের প্যাটার্ন সম্পর্কে কীভাবে ) ?

আমার অভিজ্ঞতায় ফাংশনের শুরুতে কোনও ফাংশনের প্যারামিটারগুলি বৈধতা দেওয়া এবং যেখানে উপযুক্ত সেখানে ব্যতিক্রমগুলি ছুঁড়ে ফেলা ভাল অভ্যাস হিসাবে বিবেচিত হয়।

এছাড়াও, আমি এই প্রশ্নটি মূলত ভাষা স্বাধীন বলে বিবেচনা করব। এখানে 'ভাল অনুশীলন' এমন সমস্ত ভাষার ক্ষেত্রে প্রযোজ্য যেখানে ফাংশন রয়েছে যা পরামিতি নিতে পারে যা বৈধ বা নাও হতে পারে।


1

আমার মনে হয় আপনার "বেশ নির্বোধ প্রশ্ন" এর প্রথম বাক্যটি খুব প্রাসঙ্গিক। আপনি কেন প্রথমে সেই স্বাক্ষর সহ কোনও পদ্ধতি লিখবেন? এমনকি এটি দুটি স্ট্রিং যোগফল বোঝা? যদি কলিং পদ্ধতিটি দুটি স্ট্রিংয়ের যোগফল চায় তবে কলিং পদ্ধতির দায় হ'ল তারা বৈধ ইনটগুলি কিনা তা নিশ্চিত করা এবং পদ্ধতিটি কল করার আগে তাদের রূপান্তর করা।

এই উদাহরণস্বরূপ, যদি কলিং পদ্ধতি দুটি স্ট্রিংগুলিকে কোনও ইনটে রূপান্তর করতে না পারে তবে এটি বেশ কয়েকটি কাজ করতে পারে। এই সংমিশ্রণটি কোন স্তরে ঘটে তা নির্ভর করে। আমি ধরে নিচ্ছি যে স্ট্রিং রূপান্তরটি ফ্রন্ট-এন্ড কোডের খুব কাছাকাছি হবে (যদি এটি সঠিকভাবে করা হয়), যেমন কেস ১ সবচেয়ে সম্ভবত:

  1. একটি ত্রুটি বার্তা সেট করুন এবং প্রক্রিয়াকরণ বন্ধ করুন বা ত্রুটি পৃষ্ঠায় পুনর্নির্দেশ করুন
  2. মিথ্যা ফিরিয়ে দিন (অর্থাত্, এটি যোগফলটি অন্য কোনও বস্তুর মধ্যে ফেলে দেবে এবং এটি ফেরত দেওয়ার প্রয়োজন হবে না)
  3. আপনি যেমন পরামর্শ দিচ্ছেন তেমন কিছু ব্যাডটাএক্সেপশন নিক্ষেপ করুন, তবে যতক্ষণ না এই দুটি সংখ্যার সংমিশ্রণটি খুব গুরুত্বপূর্ণ হয়, এটি ওভারকিল এবং উপরে বর্ণিত মত, এটি সম্ভবত খারাপ নকশা কারণ এটি বোঝায় যে রূপান্তরটি ভুল জায়গায় করা হচ্ছে

1

এই প্রশ্নের অনেক আকর্ষণীয় উত্তর রয়েছে। তবে আমি এখনও এটি যুক্ত করতে চাই:

স্ট্রিং পার্সিংয়ের জন্য, আমি সবসময় "নিয়মিত এক্সপ্রেশন" ব্যবহার করতে পছন্দ করি। Java.util.regex প্যাকেজটি আমাদের সহায়তা করার জন্য রয়েছে। সুতরাং আমি এই জাতীয় কিছু দিয়ে শেষ করব, যা কখনও কোনও ব্যতিক্রম ছুঁড়ে না ফেলে। আমি কিছু ত্রুটি ধরতে চাইলে একটি বিশেষ মান ফেরত দেওয়া আমার পক্ষে:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public static int sum(String a, String b) {
  final String REGEX = "\\d"; // a single digit
  Pattern pattern = Pattern.compile(REGEX);
  Matcher matcher = pattern.matcher(a);
  if (matcher.find()) { x = Integer.matcher.group(); }
  Matcher matcher = pattern.matcher(b);
  if (matcher.find()) { y = Integer.matcher.group(); }
  return x + y;
}

যেমনটি দেখতে পাচ্ছে, কোডটি কিছুটা দীর্ঘতর, তবে আমরা যা চাই তা হ্যান্ডেল করতে পারি (এবং এক্স এবং ওয়াইয়ের জন্য পূর্বনির্ধারিত মান নির্ধারণ করতে পারি, অন্য ধারাগুলির সাথে কী ঘটবে ইত্যাদি নিয়ন্ত্রণ করে ...) এমনকি আমরা আরও সাধারণ রূপান্তর লিখতে পারি রুটিন, যার কাছে আমরা স্ট্রিং, ডিফল্ট রিটার্ন মানগুলি, সংকলন করতে REGEX কোড, নিক্ষেপ করতে ত্রুটি বার্তা, ...

আশা করি এটি কার্যকর ছিল।

সতর্কতা: আমি এই কোডটি পরীক্ষা করতে সক্ষম হইনি, সুতরাং দয়া করে ইভেন্টের সিনট্যাক্স সমস্যাটি ক্ষমা করুন।


4
আমরা কি জাভা সম্পর্কে বলছি? কী Integer.matcher? privateভেরিয়েবল ভিতরে পদ্ধতি? নিখোঁজ (), Ifs জন্য প্রচুর অনুপস্থিত ;, x, yঘোষণা করা, matcherদুইবার ঘোষণা, ...
user85421

প্রকৃতপক্ষে কার্লোস, আমি তাড়াহুড়ো করে তা করেছি, এবং আমি যেমন বলেছি ততক্ষণে এটি পরীক্ষা করতে সক্ষম হয় নি। দুঃখিত আমি রেগেক্স করার পদ্ধতিটি দেখাতে চেয়েছিলাম।
লুই

ঠিক আছে, তবে এটি নম্বরের ফর্ম্যাট এক্সসেপশন - মুখ্য প্রশ্ন আইএমও - (যেটি Integer.matcher.group()বোঝাচ্ছে তা ধরে নেওয়া Integer.parseInt(matcher.group())) দিয়ে সমস্যাটি সমাধান হবে না
ব্যবহারকারী 85421

0

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

আপনার ব্যবহারকারীর ইনপুট বৈধতা এবং ব্যবসায়িক যুক্তির মধ্যে একটি স্পষ্ট বিচ্ছেদ হওয়া উচিত, সঠিক ডেটা টাইপিং ব্যবহার করুন এবং এই সমস্যাটি নিজেই অদৃশ্য হয়ে যাবে।

সত্যটি Integer.parseInt()এর পরিচিতিগুলির অর্থ - এটি বৈধ পূর্ণসংখ্যাকে পার্স করা প্রাথমিক উদ্দেশ্য । আপনি একটি সুস্পষ্ট ব্যবহারকারী ইনপুট বৈধতা / পদক্ষেপ পদক্ষেপ হারিয়েছেন missing

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