জাভা, 400
জাভা অনেক গুলি এবং এর দ্বারা ধন্য (?) অনেকগুলি রয়েছে যা একটি একক শ্রেণির ক্রিয়াকলাপের সাথে সুনির্দিষ্ট। সবচেয়ে চরম ক্ষেত্রে এক উদাহরণস্বরূপ, আছে চেয়ে বেশি 10 গুলি (সব উপশ্রেণী হয় ) নিবেদিত একা বর্গ, এবং আমি কোড ছোঁড়ার (প্রায়) তাদের সব করতে সময় নিয়েছি।Exception
Error
Exception
Exception
IllegalFormatException
Formatter
আমার বর্তমান উত্তরটিতে 40 টি বিভিন্ন Exception
গুলি / Error
গুলি রয়েছে এবং এগুলি System.nanoTime()
কিছু সংখ্যক পূর্ণসংখ্যার মডুলোর উপর নির্ভর করে এলোমেলোভাবে সম্পাদন করা হয় ।
এই পদ্ধতিটি কেবল অতিবাহিত সময় পরিমাপ করতে ব্যবহার করা যেতে পারে এবং এটি সিস্টেম বা প্রাচীর-ঘড়ির সময় সম্পর্কিত কোনও ধারণার সাথে সম্পর্কিত নয়। প্রত্যাশিত মানটি কিছু নির্দিষ্ট কিন্তু স্বেচ্ছাসেবী উত্স সময় (সম্ভবত ভবিষ্যতে, তাই মানগুলি নেতিবাচক হতে পারে) থেকে ন্যানোসেকেন্ডগুলি উপস্থাপন করে। জাভা ভার্চুয়াল মেশিনের উদাহরণে এই পদ্ধতির সমস্ত অনুরোধের মাধ্যমে একই উত্স ব্যবহৃত হয়; অন্যান্য ভার্চুয়াল মেশিন উদাহরণগুলি সম্ভবত অন্যরকম উত্স ব্যবহার করবে।
উপরের পদ্ধতিটি মঞ্জুরি দেওয়া উচিত, যেহেতু এটি " কেস এর ক্ষেত্রে পড়ে 3." মূল প্রোগ্রামের থ্রেডের শুরুতে তুলনামূলকভাবে গণনা করা না হলে "টিকস বা সিপিইউ চক্রের সংখ্যা ব্যবহার করতে পারবেন না" ।
সংকলন নির্দেশ
কোডটি চালানোর জন্য অরাকলের জেআরই / জেডিকে বা ওপেনজেডিকে দৃ strongly ়ভাবে প্রস্তাব দেওয়া হচ্ছে। অন্যথায়, কিছু ব্যতিক্রম নিক্ষেপ করা হতে পারে না, কারণ তাদের মধ্যে কিছু রেফারেন্স বাস্তবায়নের অভ্যন্তরীণ বিশদগুলিতে নির্ভর করে এবং আমার কাছে কোনও নির্ভরযোগ্য ফল-ব্যাক নেই।
নীচের কোডটি সফলভাবে সংকলন javac 1.7.0_11
করে এবং এতে সমস্ত ব্যতিক্রম উত্পাদন করে java 1.7.0_51
।
এই কোডটি চালানোর জন্য আপনাকে নীচের কোডটি কোনও ইউনিকোড সচেতন সম্পাদক (যেমন নোটপ্যাড ++) এ কপি এবং পেস্ট করতে হবে, এটি ইউটিএফ -16 এ সংরক্ষণ করুন (বিওএম-র লিখিত হওয়ার পরে বিগ-এন্ডিয়ান বা লিটল-এন্ডিয়ান কোনও ব্যাপার নয়) ।
ওয়ার্কিং ডিরেক্টরি ( cd
) উত্স কোডটি সংরক্ষণ করা হয়েছে যেখানে পরিবর্তন করুন ( এটি গুরুত্বপূর্ণ )।
নিম্নলিখিত কমান্ড সহ কোডটি সঙ্কলন করুন:
javac G19115.java -encoding "UTF-16"
এবং কোডটি চালান:
java G19115
আমার কোডে কোন ধ্বংসাত্মক কিছু নেই, যেহেতু আমি এটি আমার কম্পিউটারে চালানোর পরীক্ষাও করতে চাই। সর্বাধিক "বিপজ্জনক" কোডটি ToBeRemoved.class
বর্তমান ফোল্ডারে ফাইল মুছে ফেলা হচ্ছে । তা ছাড়া, বাকিগুলি ফাইল সিস্টেম বা নেটওয়ার্ককে স্পর্শ করে না।
import java.util.*;
import java.util.regex.*;
import java.lang.reflect.*;
import java.text.*;
import java.io.*;
import java.nio.*;
import java.nio.charset.*;
import java.security.*;
class G19115 {
// The documentation says System.nanoTime() does not return actual time, but a relative
// time to some fixed origin.
private static int n = (int) ((System.nanoTime() % 40) + 40) % 40;
@SuppressWarnings("deprecation")
public static void main(String args[]) {
/**
* If the code is stated to be a bug, then it is only guaranteed to throw Exception on
* Oracle's JVM (or OpenJDK). Even if you are running Oracle's JVM, there is no
* guarantee it will throw Exception in all future releases future either (since bugs
* might be fixed, classes might be reimplemented, and an asteroid might hit the earth,
* in order from the least likely to most likely).
*/
System.out.println(n);
switch (n) {
case 0:
// Bug JDK-7080302
// https://bugs.openjdk.java.net/browse/JDK-7080302
// PatternSyntaxException
System.out.println(Pattern.compile("a(\u0041\u0301\u0328)", Pattern.CANON_EQ));
System.out.println(Pattern.compile("öö", Pattern.CANON_EQ));
// Leave this boring pattern here just in case
System.out.println(Pattern.compile("??+*"));
break;
case 1:
// Bug JDK-6984178
// https://bugs.openjdk.java.net/browse/JDK-6984178
// StringIndexOutOfBoundsException
System.out.println(new String(new char[42]).matches("(?:(?=(\\2|^))(?=(\\2\\3|^.))(?=(\\1))\\2)+."));
// Leave this boring code here just in case
System.out.println("".charAt(1));
break;
case 2:
// IllegalArgumentException
// Bug JDK-8035975
// https://bugs.openjdk.java.net/browse/JDK-8035975
// Should throw IllegalArgumentException... by documentation, but does not!
System.out.println(Pattern.compile("pattern", 0xFFFFFFFF));
// One that actually throws IllegalArgumentException
System.out.println(new SimpleDateFormat("Nothing to see here"));
break;
case 3:
// Bug JDK-6337993 (and many others...)
// https://bugs.openjdk.java.net/browse/JDK-6337993
// StackOverflowError
StringBuffer buf = new StringBuffer(2000);
for (int i = 0; i < 1000; i++) {
buf.append("xy");
}
System.out.println(buf.toString().matches("(x|y)*"));
// Leave this boring code here just in case
main(args);
break;
case 4:
// NumberFormatException
String in4 = "123\r\n";
Matcher m4 = Pattern.compile("^\\d+$").matcher(in4);
if (m4.find()) {
System.out.println(Integer.parseInt(in4));
} else {
System.out.println("Bad input");
}
// NotABug(TM) StatusByDesign(TM)
// $ by default can match just before final trailing newline character in Java
// This is why matches() should be used, or we can call m.group() to get the string matched
break;
case 5:
// IllegalStateException
String in5 = "123 345 678 901";
Matcher m5 = Pattern.compile("\\d+").matcher(in5);
System.out.println(m5.group(0));
// The Matcher doesn't start matching the string by itself...
break;
case 6:
// ArrayIndexOutOfBoundsException
// Who is the culprit?
String[] in6 = {
"Nice weather today. Perfect for a stroll along the beach.",
" Mmmy keeyboaardd iisss bbrokkkkeeen ..",
"",
"\t\t\t \n\n"};
for (String s: in6) {
System.out.println("First token: " + s.split("\\s+")[0]);
}
// Culprit is "\t\t\t \n\n"
// String.split() returns array length 1 with empty string if input is empty string
// array length 0 if input is non-empty and all characters match the regex
break;
case 7:
// ConcurrentModificationException
List<Integer> l7 = testRandom(42);
Integer prev = null;
// Remove duplicate numbers from the list
for (Integer i7: l7) {
if (prev == null) {
prev = i7;
} else {
if (i7.equals(prev)) {
l7.remove(i7);
}
}
}
System.out.println(l7);
// This is one of the typical mistakes that Java newbies run into
break;
case 8:
// ArithmeticException
// Integer division by 0 seems to be the only way to trigger this exception?
System.out.println(0/0);
break;
case 9:
// ExceptionInInitializerError
// Thrown when there is an Exception raised during initialization of the class
// What Exception will be thrown here?
Static s9 = null;
System.out.println(s9.k);
// A bit less interesting
Static ss9 = new Static();
// ----
// A class is only initialized when any of its method/field is
// used for the first time (directly or indirectly)
// Below code won't throw Exception, since we never access its fields or methods
// Static s;
// OR
// Static s = null;
break;
case 10:
// BufferOverflowException
short s10 = 20000;
ShortBuffer b10 = ShortBuffer.allocate(0).put(s10);
// Boring stuff...
break;
case 11:
// BufferUnderflowException
ShortBuffer.allocate(0).get();
// Another boring stuff...
break;
case 12:
// InvalidMarkException
ShortBuffer.allocate(0).reset();
// Boring stuff again...
// reset() cannot be called if mark() is not called before
break;
case 13:
// IndexOutOfBoundsException
System.out.println("I lost $m dollars".replaceAll("[$]m\\b", "$2"));
// $ needs to be escaped in replacement string, since it is special
break;
case 14:
// ClassCastException
Class c14 = Character.class;
for (Field f: c14.getFields()) {
System.out.println(f);
try {
int o = (int) f.get(c14);
// If the result is of primitive type, it is boxed before returning
// Check implementation of sun.reflect.UnsafeStaticIntegerFieldAccessorImpl
System.out.println(o);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
break;
case 15:
// NoSuchElementException
List<Integer> l15 = new ArrayList<Integer>();
Iterator i = l15.iterator();
System.out.println(i.next());
// Another boring one...
break;
case 16:
// ArrayStoreException
Object x[] = new String[3];
x[0] = new Integer(0);
// Straight from the documentation
// I don't even know that this exists...
break;
case 17:
// IllegalThreadStateException
Thread t17 = new Thread();
t17.start();
t17.setDaemon(true);
// setDaemon can only be called when the thread has not started or has died
break;
case 18:
// EmptyStackException
Stack<Integer> s18 = new Stack<Integer>();
s18.addAll(testRandom(43));
while (s18.pop() != null);
// Originally ThreadDeath, which works when running from Dr. Java but not when
// running on cmd line. Seems that Dr. Java provides its own version of
// Thread.UncaughtExceptionHandler that prints out ThreadDeath.
// Please make do with this boring Exception
break;
case 19:
// NegativeArraySizeException
Array.newInstance(Integer.TYPE, -1);
// Do they have to create such a specific Exception?
break;
case 20:
// OutOfMemoryError
Array.newInstance(Integer.TYPE, 1000, 1000, 1000, 1000);
break;
case 21:
// UnsupportedCharsetException
// UCS-2 is superseded by UTF-16
Charset cs21 = Charset.forName("UCS-2");
CharsetEncoder ce21 = cs21.newEncoder();
// Just in case...
cs21 = Charset.forName("o_O");
// "o_O" is a (syntactically) valid charset name, so it throws UnsupportedCharsetException
break;
case 22:
// IllegalCharsetNameException
boolean isSupported;
isSupported = Charset.isSupported("o_O");
isSupported = Charset.isSupported("+_+");
Charset cs22 = Charset.forName("MerryChristmas!Hohoho!");
// This is getting stupid...
break;
case 23:
// NoClassDefFoundError
File f = new File("ToBeRemoved.class");
f.delete();
ToBeRemoved o23 = new ToBeRemoved();
// This shows that class is loaded on demand
break;
case 24:
// InputMismatchException
Scanner sc = new Scanner("2987654321");
sc.nextInt();
// Out of range
break;
case 25:
// Formatter class has many RuntimeException defined
// DuplicateFormatFlagsException
System.out.printf("%0000000000000000000000000000000000000000000000000005%d\n", 42);
break;
case 26:
// FormatFlagsConversionMismatchException
System.out.printf("%,d\n", Integer.MAX_VALUE);
System.out.printf("%,x\n", Integer.MAX_VALUE);
// Thousand separator is only applicable to base 10
System.out.printf("%(5.4f\n", Math.PI);
System.out.printf("%(5.4f\n", -Math.PI);
System.out.printf("%(5.4a\n", -Math.PI);
// '(' flag is used to surround negative value with "( )" instead of prefixing with '-'
// '(' can't be used with conversion 'a'
break;
case 27:
// IllegalFormatCodePointException
System.out.printf("%c", Character.MAX_CODE_POINT + 1);
// Larger than current Unicode maximum code point (0x10FFFF)
break;
case 28:
// IllegalFormatConversionException
String i28 = "0";
System.out.printf("%d", i28);
// A boring example
break;
case 29:
// IllegalFormatFlagsException
System.out.printf("% d\n", Integer.MAX_VALUE);
System.out.printf("% d\n", Integer.MIN_VALUE);
System.out.printf("%+d\n", Integer.MAX_VALUE);
System.out.printf("%+d\n", Integer.MIN_VALUE);
System.out.printf("% +d\n", Integer.MIN_VALUE);
// Use either ' ' or '+ ' flag, not both, since they are mutually exclusive
break;
case 30:
// IllegalFormatPrecisionException
System.out.printf("%5.4f\n", Math.PI);
System.out.printf("%5.4a\n", Math.PI);
System.out.printf("%5.4x\n", Math.PI);
// Precision does not apply to 'x', which is integer hexadecimal conversion
// To print a floating point number in hexadecimal, use conversion 'a'
break;
case 31:
// IllegalFormatWidthException
System.out.printf("%3n");
// For conversion n, width is not supported
break;
case 32:
// MissingFormatArgumentException
System.out.printf("%s\n%<s", "Pointing to previous argument\n");
System.out.printf("%<s", "Pointing to previous argument");
// No previous argument
break;
case 33:
// MissingFormatWidthException
System.out.printf("%5d %<d\n", 42); // Pad left
System.out.printf("%-5d %<d\n", 42); // Pad right
System.out.printf("%-d\n", 42);
// Missing width
break;
case 34:
// UnknownFormatConversionException
System.out.printf("%q", "Shouldn't work");
// No format conversion %q
// UnknownFormatFlagsException cannot be thrown by Formatter class in
// Oracle's implementation, since the flags have been checked in the regex
// used to recognize the format string
break;
case 35:
// IllformedLocaleException
System.out.printf(new Locale("ja"), "%tA %<tB %<tD %<tT %<tZ %<tY\n", new Date());
System.out.printf(new Locale.Builder().setLanguage("ja").setScript("JA").setRegion("JA").build(), "%tA %<tB %<tD %<tT %<tZ %<tf\n", new Date());
// Thrown by Locale.Builder.setScript()
break;
case 36:
// NullPointerException
Pattern p36 = Pattern.compile("a(b)?c");
Matcher m36 = p36.matcher("ac");
if (m36.find()) {
for (int i36 = 0; i36 <= m36.groupCount(); i36++) {
// Use Matcher#end(num) - Matcher#start(num) for length instead
System.out.printf("%3d [%d]: %s\n", i36, m36.group(i36).length(), m36.group(i36));
}
}
break;
case 37:
// AccessControlException
System.setSecurityManager(new SecurityManager());
System.setSecurityManager(new SecurityManager());
break;
case 38:
// SecurityException
// Implementation-dependent
Class ϲlass = Class.class;
Constructor[] constructors = ϲlass.getDeclaredConstructors();
for (Constructor constructor: constructors) {
constructor.setAccessible(true);
try {
Class Сlass = (Class) constructor.newInstance();
} catch (Throwable e) {
System.out.println(e.getMessage());
}
// The code should reach here without any Exception... right?
}
// It is obvious once you run the code
// There are very few ways to get SecurityException (and not one of its subclasses)
// This is one of the ways
break;
case 39:
// UnknownFormatFlagsException
// Implementation-dependent
try {
System.out.printf("%=d", "20");
} catch (Exception e) {
// Just to show the original Exception
System.out.println(e.getClass());
}
Class classFormatter = Formatter.class;
Field[] fs39 = classFormatter.getDeclaredFields();
boolean patternFound = false;
for (Field f39: fs39) {
if (Pattern.class.isAssignableFrom(f39.getType())) {
f39.setAccessible(true);
// Add = to the list of flags
try {
f39.set(classFormatter, Pattern.compile("%(\\d+\\$)?([-#+ 0,(\\<=]*)?(\\d+)?(\\.\\d+)?([tT])?([a-zA-Z%])"));
} catch (IllegalAccessException e) {
System.out.println(e.getMessage());
}
patternFound = true;
}
}
if (patternFound) {
System.out.printf("%=d", "20");
}
// As discussed before UnknownFormatFlagsException cannot be thrown by Oracle's
// current implementation. The reflection code above add = to the list of flags
// to be parsed to enable the path to the UnknownFormatFlagsException.
break;
}
}
/*
* This method is used to check whether all numbers under d are generated when we call
* new Object().hashCode() % d.
*
* However, hashCode() is later replaced by System.nanoTime(), since it got stuck at
* some values when the JVM is stopped and restarted every time (running on command line).
*/
private static List<Integer> testRandom(int d) {
List<Integer> k = new ArrayList<Integer>();
for (int i = 0; i < 250; i++) {
k.add(new Object().hashCode() % d);
}
Collections.sort(k);
System.out.println(k);
return k;
}
}
class ToBeRemoved {};
class Static {
static public int k = 0;
static {
System.out.println(0/0);
}
}
ব্যতিক্রম এবং ত্রুটিগুলির তালিকা
স্যুইচ-কেস স্টেটমেন্ট হিসাবে ঘোষিত হিসাবে। মোট 37 Exception
টি এবং 3 Error
টি রয়েছে।
- প্যাটার্নসিন্ট্যাক্স এক্সেপশন (বাগের মাধ্যমে
Pattern
, ব্যাকআপ হিসাবে বোরিং কেস সহ)
- স্ট্রিংইন্ডেক্সআউট অফফাউন্ডস এক্সসেপশন (বাগের মাধ্যমে
Pattern
, ব্যাকআপ হিসাবে বোরিং কেস সহ)
- অবৈধ অরগমেন্ট এক্সসেপশন (
Pattern
ব্যাকআপ হিসাবে বিরক্তিকর কেস সহ আমাকে একটি বাগ খুঁজে পেতে সহায়তা করে )
- স্ট্যাকওভারফ্লো এরিয়ার (
Pattern
ব্যাকআপ হিসাবে বোরিং কেস সহ পুনরাবৃত্তির প্রয়োগের মাধ্যমে )
- NumberFormatException (অনুষ্ঠান
$
মধ্যে Pattern
আগে চূড়ান্ত লাইন টারমিনেটর মেলাতে পারে)
- অবৈধ স্টেট এক্সেপশন (
Matcher
কোনও ম্যাচ না করেই ম্যাচের গ্রুপগুলিতে অ্যাক্সেসের মাধ্যমে )
- অ্যারেআইন্ডেক্সআউটআউটবাউন্ডসেক্সশন (এর বিভ্রান্তিমূলক আচরণ দেখায়
split(String regex)
)
- সমকালীন মডিফিকেশন এক্সসেপশন (প্রতিটি লুপের সময় সংগ্রহ সংশোধন করার মাধ্যমে)
- গাণিতিক ধারণা (0 দ্বারা পূর্ণসংখ্যা বিভাগের মাধ্যমে)
- এক্সপেশনআইনিটায়ালাইজার এয়ার (
Exception
একটি ক্লাস শুরু করার সময় দিয়ে যাওয়ার মাধ্যমে )
- BufferOverflowException (
java.nio.*
-specific Exception
)
- BufferUnderflowException (
java.nio.*
-specific Exception
)
- InvalidMarkException (
java.nio.*
-specific Exception
)
- ইনডেক্সআউট অফফাউন্ডস এক্সসেপশন (প্রতিস্থাপনে অস্তিত্বহীন ক্যাপচারিং গ্রুপের রেফারেন্সের মাধ্যমে)
- ClassCastException
- NoSuchElementException
- ArrayStoreException
- IllegalThreadStateException
- EmptyStackException (
java.util.Stack
-specific Exception
)
- NegativeArraySizeException
- আউট অফ মেমরিরির (বড় অ্যারের বোরিং বরাদ্দের মাধ্যমে)
- UnsupportedCharsetException
- অবৈধচরসনেট নাম ধারণা (
Charset.isSupported(String name)
মিথ্যা বা প্রত্যাবর্তনের সময় দেখায় Exception
)
- NoClassDefFoundError (দেখায় যে ক্লাসগুলি পদ্ধতি / নির্মাতা বা ক্ষেত্রের প্রথম অ্যাক্সেসে লোড করা হয়েছে)
- InputMismatchException (
java.util.Scanner
-specific Exception
)
- ডুপ্লিকেট
java.util.Formatter
ফর্ম্যাটফ্ল্যাজ এক্সেপশন (এখান থেকে 35 টি স্পেসিফিক Exception
এস)
- ফর্ম্যাটফ্ল্যাজস রূপান্তরমিশমাচএক্সেপশন (ফর্ম্যাট সিনট্যাক্সের আকর্ষণীয় উদাহরণ সহ)
- IllegalFormatCodePointException
- IllegalFormatConversionException
- IllegalFormatFlagsException
- IllegalFormatPrecisionException
- IllegalFormatWidthException
- মিসিং ফরমেটআর্গুমেন্টএক্সেপশন (ফর্ম্যাট সিনট্যাক্সের আকর্ষণীয় উদাহরণ সহ)
- MissingFormatWidthException
- UnknownFormatConversionException
- IllformedLocaleException
- নাল পয়েন্টার ব্যতিক্রম
- অ্যাক্সেস কন্ট্রোলএক্সেপশন (দেখায় যে ডিফল্টটি
SecurityManager
ব্যবহারযোগ্য)
- সিকিউরিটি এক্সসেপশন (
Class
ক্লাসের কনস্ট্রাক্টরের মাধ্যমে )
- অজানা ফোর্ম্যাট্লেক্সএক্সেপশন (দেখায় যে এটি
Exception
ওরাকলের প্রয়োগে নিক্ষেপ করা যাবে না, কোনও ব্যাকআপ নেই)