Професионална програма
Loading...
vlastomar avatar vlastomar 16 Точки

Задача Suitcases Load

При решаване на задача Suitcases Load Judge ми дава една грешка Test#2 (Runtime error).

Кода е по долу. Ако може някой да помогне!

import java.util.Scanner;

public class SuitcaseLoad {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        double volRemain = Double.parseDouble(scan.nextLine());
      
        String volumeSuitcase = "";
        
        double volSuitcase = 0.00;
        int counter = 0;
        int a =0;
        int b = 1;

            while (true) {
                volumeSuitcase = scan.nextLine();
                if (volumeSuitcase.equals("End")) {
                    break;
                }

                volSuitcase = Double.parseDouble(volumeSuitcase);
                if (volRemain < volSuitcase) {
                    a = 1;
                    break;
                }else if (volRemain == volSuitcase && b == 1) {
                    if (volRemain != 0) {
                        counter++;
                    }
                    a = 1;
                    break;
                }
                counter++;
                if (counter % 3 == 0 && counter !=0) {
                    volSuitcase = volSuitcase * 1.10;
                }

                volRemain = volRemain - volSuitcase;
                b = 0;



            }
            if (a == 1) {
                System.out.println("No more space!");
                System.out.printf("Statistic: %d suitcases loaded.", counter);
            } else if (volumeSuitcase.equals("End")){
                System.out.println("Congratulations! All suitcases are loaded!");
                System.out.printf("Statistic: %d suitcases loaded.", counter);
            }

            }
        }


 

0
Programming Basics with Java
MartinBG avatar MartinBG 3751 Точки

Test #2 вхърля Exception (Runtime error) на този ред:

volSuitcase = Double.parseDouble(volumeSuitcase);

 

Double#parseDouble:

 

public static double parseDouble(String s)
                          throws NumberFormatException

Returns a new double initialized to the value represented by the specified String, as performed by the valueOf method of class Double.

Parameters:

s - the string to be parsed.

Returns:

the double value represented by the string argument.

Throws:

NullPointerException - if the string is null

NumberFormatException - if the string does not contain a parsable double.

 В случая не хвърля NullPointerException (NPE), защото ако volumeSuitcase беше null, програмата щеше да гръмне по-горе:

if (volumeSuitcase.equals("End"))

Между другото, при сравняване на литерал ("my literal") с променлива, винаги използвай следният формат, който ни предпазва от NPE, в случай че променливата е null:

"End".equals(volumeSuitcase)

 

Следователно, програмата гърми с NumberFormatException, от което следва, че volumeSuitcase е стринг, който не е валидно число, и по-точно - празен стринг:

добави if (volumeSuitcase.isEmpty()) break; 

преди volSuitcase = Double.parseDouble(volumeSuitcase); 

и програмата ще даде грешен резултат на 2-ри тест, вместо да крашне.

 

Причината да получим празен сринг, е че има пропуски/грешки в алгоритъма за товарене на куфарите и се стига до ситуация, при която в Judge свършват входните данни.

Прегледай си отново алгоритъма - има какво да се изчиства по него.

0
15/04/2020 18:58:24
vlastomar avatar vlastomar 16 Точки

Много благодаря за подробното обяснение.

0