Prośba o wyjaśnienie kodu TRY-CATCH

0

Witjacie,
czy ktoś może wyjaśnić mi krok po kroku działanie tego kodu? Z góry dziękuje.

public static void checkSelected() {
        boolean check = true;
        try {
            for (boolean radioChecked : checked)
                check = check && radioChecked;
        }
        catch (NullPointerException ne) {

            check = false;
        }
        if (check)
            buttonCheckAnswer.setVisibility(View.VISIBLE);
    }
2

Jest to tragicznie napisany kod który sprawdza czy wszystkie wartości wpisane w checked są równe true. Cały ten try catch ma chronić przed NPE, czyli gdy obecnie iterowana wartość checked będzie równa null, nastąpi Autoboxing i wyrzucenie wyjątku. Sterowanie wyjątkami i do tego NPE eh...
Lepsze imlementacje:

boolean check = true;
for (boolean radioChecked : checked) {
check = check && Boolean.TRUE == radioChecked;
}
if (check)
    buttonCheckAnswer.setVisibility(View.VISIBLE);
boolean check = true;
for (boolean radioChecked : checked) {
   if(Boolean.TRUE != radioChecked){
      check = false; 
      continue;
   } 
}
if (check)
    buttonCheckAnswer.setVisibility(View.VISIBLE);
boolean check = checked.stream().allMatch(radioChecked -> Boolean.TRUE == radioChecked);
if (check)
    buttonCheckAnswer.setVisibility(View.VISIBLE);
0

no więc to było tak:

masz listę (albo zbiór) booleanów i jeśli jest jakiś element listy Nullem to w catchu wyrzuci NPE i ustawi wartość "check" na false.

0

Dziękuję chłopaki. Krzychu, mógłbyś dopisać wyjaśnienie dlaczego to tragicznie napisany kod? Pytam z czystej ciekawości bo przerabiam właśnie ten dział w książce i czarna magia :)

0

Napisałem :)

  • Sterowanie wyjątkami - wyjątki służą, jak sama nazwa wskazuje, do sytuacji wyjątkowych. W tym kodzie brak zaznaczonych wszystkich boxów to normalna sprawa
  • Obsługa NullPointerException to zło - Tego się unika jak ognia, a nie wykorzystuje. Jeżeli wiesz że w kodzie może wylecieć NPE, to znaczy że możesz go zmienić tak, żeby nie leciał. To trochę tak jakbyś wiedział że koło w samochodzie trzyma się tylko na 2 śrubach więc zamiast dokręcić pozostałe i nie mieć problemu, to wykupujesz dobrą opiekę medyczną i autocasco.
0

Dobre :) Dziękuje. Czyli gdy mam quiz w postaci 18 pytań - 3 rb pod każdym pytaniem - jedna odpowiedź prawidłowa to mogę śmiało zastosować Twoje propozycje powyżej?

To moje MainActivity


```public class MainActivity extends AppCompatActivity {

    private static int NUMBER_OF_QUESTIONS = 3;
    public static Boolean[] answer = new Boolean[NUMBER_OF_QUESTIONS];
    public static Boolean[] checked = new Boolean[NUMBER_OF_QUESTIONS];
    private static Button buttonCheckAnswer;

    private ViewPager viewPager;
    private List<Fragment> fragmentList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        buttonCheckAnswer = (Button) findViewById(R.id.button_check_answers);


        viewPager = (ViewPager) findViewById(R.id.fragment_container);

        fragmentList = new ArrayList<Fragment>();
        fragmentList.add(new Fragment1());
        fragmentList.add(new Fragment2());
        fragmentList.add(new Fragment3 ());

        PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager(), fragmentList);
        viewPager.setAdapter(adapter);

        final Intent intent = new Intent(MainActivity.this, AnswerActivity.class);

        buttonCheckAnswer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (checkAnswers())
                    intent.putExtra("Key Answer", true);

                else
                    intent.putExtra("Key Answer", false);
                startActivity(intent);
            }
        });

        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                if(position == (NUMBER_OF_QUESTIONS-1))
                    checkSelected();
                else
                if (buttonCheckAnswer.getVisibility() == View.VISIBLE)
                    buttonCheckAnswer.setVisibility(View.GONE);

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    public static void checkSelected() {
        boolean check = true;
        try {
            for (boolean radioChecked : checked)
                check = check && radioChecked;
        }
        catch (NullPointerException ne) {

            check = false;
        }
        if (check)
            buttonCheckAnswer.setVisibility(View.VISIBLE);
    }

    private boolean checkAnswers() {
        boolean correct = true;
        for (boolean radioAnswer : answer)
            correct = correct && radioAnswer;
        return correct;
    }
}
0

Możesz użyć 1 i 2, ale najpierw sam musisz zrozumieć co tam się dzieje i czym różni się od przykładu. Pisanie na ślepo nie ma sensu. 3 przykład działa od javy 8, ale tej natywnie nie ma w Androidzie, a jeżeli dopiero zaczynasz to nie ma sensu się męczyć.

W jakiej książce znalazłeś taki kwiatek?

0

Ten kod akurat miałem zasugerowany przez kogoś. Co do książek... przerabiam teraz 'Java Podstawy wydanie IX' Horstmanna ale dla totalnego laika jednak jest to trudna książka.. Myślę też nad zakupem 'Android. Programowanie aplikacji. Rusz głową!'. Co sądzisz o tych książkach i czy poleciłbyś jakieś inne? Oprócz tutoriali online...

1

Seria "Rusz głową!" jest taka sobie, ale lepsza niż jakaś biblia typu "Thinking in Java", więc spoko.
Najlepiej jakbyś robił dużo przykładów, ale niezbyt rozbudowanych, np. zadania ze SPOJa, http://www.spoj.com/
Poczytaj o sposobach sortowania typu Bubble Sort, Quick Sort, Merge Sort itp. Próbuj zrealizować takie przykłady bez użycia oczywiście już wbudowanych w Javie rozwiązań, wykorzystując np. tablice intów.
Przerób materiał z modyfikatorów dostępu. To są podstawy podstaw w Javie, ale jest trochę kruczków, które warto znać, bo w końcu Java to język obiektowy i nie wszystko jest public static void.
Jak już będziesz miał jakieś pojęcie o powyższych zagadnieniach to polecam zagłębić się w dokumentację Javy i porobić przykłady ze strony Oracle. Nie są jakieś wybitne, ale materiał jest całkiem dobrze opisany.
Następnie poczytaj o wzorcach projektowych, bo one są powszechnie stosowane. Nawet głupi i dobrze wszystkim znany Bean, został dawno temu opisany w pracy teoretycznej, a jako wzorzec jest najczęściej wykorzystywany.
Cierpliwości, bo tego jest sporo, ale do ogarnięcia :)

0

Hej trojanus. Serdeczne dzięki za te ważne informacje. Są naprawdę pomocne dla mnie. Daje łapkę w górę.
Miłego dnia dla wszystkich.

Ps. Mógłby ktoś jeszcze wytłumaczyć to zdanie, nie rozumiem co znaczy "odwołać się do referencji..."

"KlasaC może odwołać się do zmiennych oznaczonych jako protected, ale tylko poprzez referencje do KlasyC oraz klas potomnych, nie może się odwołać do tej zmiennej korzystając bezpośrednio z referencji do KlasyA."

patrząc na przykład w tym linku

http://blog.stelmisoft.pl/2010/modyfikator-dostepu-protected-i-default-javie/

0

ogólnie "referencja" to jest wskazywanie na obiekt w JVM. Przykładowo:

  String myName = new String("Janusz");

relacja jaka zachodzi między myName i obiektem String("Janusz") to jest referencja. Innymi słowy, referencja to jest przypisanie Obiektu w JVM do zmiennej.
W ogóle to sobie srogie przykłady wybrałeś. Zerknij na doku od Oracle.

0

Dziękuję trojanus. Masz racje z tymi "srogimi przykładami" :) Czy mógłbyś podać link do tych przykładów na Oracle bo nie mogę na nie trafić. Z góry dziękuje.

0

@Kubs//translate.google.pl/?hl=pl#auto/pl/NullPointerException%3A%20Attempt%20to%20invoke%20virtual%20method%20%27boolean%20java.lang.Boolean.booleanValue()%27%20on%20a%20null%20object%20reference

0

@Kubs: Wklej kod, który napisałeś i stack trace
Gdzieś w wywoływanej metodzie natrafiasz na nulla i się wszystko sypie.

0

logCat

04-26 13:13:34.055 2199-2199/make.appaplication E/InputEventReceiver: Exception dispatching input event.
04-26 13:13:34.055 2199-2199/make.appaplication E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
04-26 13:13:34.063 2199-2199/make.appaplication E/MessageQueue-JNI: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Boolean.booleanValue()' on a null object reference
                                                                        at make.appaplication.MainActivity.checkSelected(MainActivity.java:125)
                                                                        at make.appaplication.MainActivity$2.onPageSelected(MainActivity.java:109)
                                                                        at android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1967)
                                                                        at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:685)
                                                                        at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:669)
                                                                        at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:2284)
                                                                        at android.view.View.dispatchTouchEvent(View.java:9939)
                                                                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
                                                                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2344)
                                                                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                        at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:411)
                                                                        at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1810)
                                                                        at android.app.Activity.dispatchTouchEvent(Activity.java:3061)
                                                                        at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71)
                                                                        at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:373)
                                                                        at android.view.View.dispatchPointerEvent(View.java:10159)
                                                                        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4434)
                                                                        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4302)
                                                                        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849)
                                                                        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902)
                                                                        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868)
                                                                        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3995)
                                                                        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876)
                                                                        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4052)
                                                                        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849)
                                                                        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902)
                                                                        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868)
                                                                        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876)
                                                                        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849)
                                                                        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6210)
                                                                        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6184)
                                                                        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6145)
                                                                        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6313)
                                                                        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
                                                                        at android.os.MessageQueue.nativePollOnce(Native Method)
                                                                        at android.os.MessageQueue.next(MessageQueue.java:323)
                                                                        at android.os.Looper.loop(Looper.java:136)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
04-26 13:13:34.065 2199-2199/make.appaplication D/AndroidRuntime: Shutting down VM
                                                                  
                                                                  
                                                                  --------- beginning of crash
04-26 13:13:34.068 2199-2199/make.appaplication E/AndroidRuntime: FATAL EXCEPTION: main
                                                                  Process: make.appaplication, PID: 2199
                                                                  java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Boolean.booleanValue()' on a null object reference
                                                                      at make.appaplication.MainActivity.checkSelected(MainActivity.java:125)
                                                                      at make.appaplication.MainActivity$2.onPageSelected(MainActivity.java:109)
                                                                      at android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1967)
                                                                      at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:685)
                                                                      at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:669)
                                                                      at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:2284)
                                                                      at android.view.View.dispatchTouchEvent(View.java:9939)
                                                                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
                                                                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2344)
                                                                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                      at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:411)
                                                                      at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1810)
                                                                      at android.app.Activity.dispatchTouchEvent(Activity.java:3061)
                                                                      at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71)
                                                                      at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:373)
                                                                      at android.view.View.dispatchPointerEvent(View.java:10159)
                                                                      at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4434)
                                                                      at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4302)
                                                                      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849)
                                                                      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902)
                                                                      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868)
                                                                      at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3995)
                                                                      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876)
                                                                      at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4052)
                                                                      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849)
                                                                      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902)
                                                                      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868)
                                                                      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876)
                                                                      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849)
                                                                      at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6210)
                                                                      at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6184)
                                                                      at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6145)
                                                                      at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6313)
                                                                      at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
                                                                      at android.os.MessageQueue.nativePollOnce(Native Method)
                                                                      at android.os.MessageQueue.next(MessageQueue.java:323)
                                                                      at android.os.Looper.loop(Looper.java:136)
                                                                      at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
04-26 13:13:34.068 2199-2199/make.appaplication E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

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