Jak łapać każdy błąd jako 1 exception w javie?

0

Czy da się zrobić coś takiego jak w R, żeby jakikolwiek błąd obsługiwać w taki sam sposób, czyli co wpisać by mi wypisywał komunikat przy jakimkolwiek błędzie?



public class Testuj {

	public static void main(String[] args)  {
 
    	try{
    		int x = 10/0;
    	}catch ( e) { //tutaj co wpisać by łapać każdy błąd
    		System.out.println("dziwne... u mnie dziala");
    	}
   
    }

}

próbowałem catch (Exception e) ale nie działa dla błędów.

0

chyba, z tego co pamiętam, bo kiedyś czytałem jedną książkę, ale nigdy w tym języku nie programowałem:

catch(...) 
1

próbowałem catch (Exception e) ale nie działa dla błędów.

To spróbuj catch (Throwable t) może : https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html

catch(...)

Na pewno? To jest C++, nie jestem pewien ale wątpię czy dla Javy działa

EDIT: A, i jeszcze jedno: jak znam życie, to zaraz ktoś bardziej doświadczony powie, że nie należy łapać każdego możliwego wyjątku, że to jest bad practice, code smell, antipattern, etc.

0

@kmph: nie działa:


import java.lang.Throwable;

public class Testuj {

	public static void main(String[] args) {

		try {
			int x = aa;
		} catch (Throwable t) { // tutaj co wpisać by łapać każdy błąd
			System.out.println("dziwne... u mnie dziala");
		}
		// System.out.println(x);
	}

}

0

Jak na razie się nie kompiluje, więc nie działa ale z innego powodu.

Chyba, że pokażesz cały kod, tam gdzie gdzieś deklarujesz to aa. Bo w Javie nie wolno Ci użyć niezadeklarowanego nigdzie symbolu.

"Nie kompiluje się" to jest coś zupełnie innego niż "rzuca wyjątek."

EDIT: Pięknie działa:

    /* package whatever; // don't place package name! */
     
    import java.util.*;
    import java.lang.*;
    import java.io.*;
     
    /* Name of the class has to be "Main" only if the class is public. */
    class Ideone
    {
    	public static void main (String[] args) throws java.lang.Exception
    	{
    		try {
                int[] tab = new int[2147483647];
            } catch (Throwable t) { // tutaj co wpisać by łapać każdy błąd
                System.out.println("dziwne... u mnie dziala");
            }
            // System.out.println(x);
    	}
    }

https://ideone.com/fVGLWT

PPS. throws java.lang.Exception - to samo, zaraz ktoś powie że to bardzo zła praktyka

0

czyli rozumiem, że nie da się zrobić tak bym wpisał w try byle co i program się skompilował...

bo ja bym chciał np. żeby mi program leciał dalej nawet jak wpisze int x = 2.5454;

1

Ano nie. Najprostsze nonsensy takie jak użycie niezadeklarowanej zmiennej zostaną wyłapane na etapie kompilacji i w ogóle nie otrzymasz pliku, który mógłbyś uruchomić. Podczas gdy dzielenie przez zero rzuci Ci wyjątek podczas wykonania programu (w ogólnym przypadku nie jest możliwe wyłapanie takiego błędu na etapie statycznej analizy kodu, bez uruchomienia go).

1

Poprawiam się, bo bzdurę napisałem.

• Dzielenie przez zero rzuca wyjątkiem, a nie Errorem. Zatem to działa bez problemu:

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
        try{
            int x = 10/0;
        }catch (Exception e) {
            System.out.println("dziwne... u mnie dziala");
        }
	}
}

https://ideone.com/HmlYYj

• Error natomiast jest rzucany np. jeśli zażądasz więcej pamięci, niż możesz dostać. Zatem w tym programie poleci niewyłapany Error:

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		try {
            int[] tab = new int[2147483647];
        } catch (Exception t) { // tutaj co wpisać by łapać każdy błąd
            System.out.println("dziwne... u mnie dziala");
        }
        // System.out.println(x);
	}
}

https://ideone.com/STqE2T

Podczas gdy teraz wyłapiesz błąd:

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		try {
            int[] tab = new int[2147483647];
        } catch (Error t) { // tutaj co wpisać by łapać każdy błąd
            System.out.println("dziwne... u mnie dziala");
        }
        // System.out.println(x);
	}
}

https://ideone.com/cSz2PH

Oczywiście catch(Throwable t) zadziała tym bardziej, bo Throwable łapie i wyjątki, i błędy.

• Poza bardzo szczególnymi przypadkami łapanie Errorów nie jest dobrym pomysłem. Z dokumentacji: https://docs.oracle.com/javase/8/docs/api/java/lang/Error.html

An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions.

1 użytkowników online, w tym zalogowanych: 0, gości: 1