Как это исправить, NumberFormatException: для входной строки: «[D@548b7f67» - PullRequest
0 голосов
/ 05 мая 2020

На этот вопрос уже есть ответы здесь:

java .lang.NumberFormatException: для входной строки: «0,000» [дубликат]

Итак, я получаю эта ошибка при запуске кода блока ниже:

Сообщение об ошибке:

  java.lang.NumberFormatException: For input string: "[D@548b7f67"
        at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
        at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
        at java.lang.Double.parseDouble(Unknown Source)
        at org.cloudbus.cloudsim.power.PowerVmAllocationPolicyMigrationLocalRegression.isHostOverUtilized(PowerVmAllocationPolicyMigrationLocalRegression.java:169)
        at org.cloudbus.cloudsim.power.PowerVmAllocationPolicyMigrationAbstract.getOverUtilizedHosts(PowerVmAllocationPolicyMigrationAbstract.java:397)
        at org.cloudbus.cloudsim.power.PowerVmAllocationPolicyMigrationAbstract.optimizeAllocation(PowerVmAllocationPolicyMigrationAbstract.java:96)
        at org.cloudbus.cloudsim.power.PowerDatacenter.updateCloudletProcessing(PowerDatacenter.java:102)


**My Code:**

    @Override
    protected boolean isHostOverUtilized(PowerHost host) {

        PowerHostUtilizationHistory _host = (PowerHostUtilizationHistory) host;

        double[] utilizationHistory = _host.getUtilizationHistory();
        double[] ramUtilizationHistory = _host.getRamUtilizationHistory();
        double[] bwUtilizationHistory = _host.getBWUtilizationHistory();

        final List<double[]> utiLizationList = Arrays.asList(utilizationHistory, 
        ramUtilizationHistory, bwUtilizationHistory);
        double x[][] = new double[utilizationHistory.length][3];

        for(int i = 0; i< utilizationHistory.length;i++)
        {   
            for(int j=0; j<utiLizationList.size(); j++){
                x[i][j] = utiLizationList.get(j)[i];
                //System.out.print(" "+ x[i][j] +"");
            }
            //System.out.println();
        }


        double[] y = new double[utilizationHistory.length];

        for(int i=0; i<utilizationHistory.length; i++)
        {
            y[i] =  
           (double) utilizationHistory[i]/1-(double) 
                    utilizationHistory[i] *
                    (double) ramUtilizationHistory[i]/1-(double) ramUtilizationHistory[i] *
                    (double) bwUtilizationHistory[i]/1-(double) bwUtilizationHistory[i] ;
        }

        for(int i=0; i<utilizationHistory.length; i++)
        {
            //Log.printLine("   "+ y[i]);
        }

        int length = 10; // we use 10 to make the regression responsive enough to latest values
        if (utilizationHistory.length < length) {
            return getFallbackVmAllocationPolicy().isHostOverUtilized(host);
        }

        double[] utilizationHistoryReversed = new double[length];
        for (int i = 0; i < length; i++) {
            utilizationHistoryReversed[i] = utilizationHistory[length - i - 1];
        }

        OLSMultipleLinearRegression regression = null;
        try {
            regression = getParameterEstimates(x, y);
        } catch (IllegalArgumentException e) {
            return getFallbackVmAllocationPolicy().isHostOverUtilized(host);
        }

        double[] estimates = regression.estimateRegressionParameters();

        for(int i=0; i<estimates.length; i++)
        {
            Log.printLine("estimates ______  "+ estimates[i]);
        }


//      System.exit(0);

//      double migrationIntervals = Math.ceil(getMaximumVmMigrationTime(_host) / getSchedulingInterval());
        //double predictedUtilization = estimates[0] + estimates[1] * (length + migrationIntervals);

        double predictedUtilization = 0;

        for(int i=0; i<utilizationHistory.length; i++)
        {
             predictedUtilization = estimates[0] +
                    (estimates[1] * utilizationHistory[i]) +
                    (estimates[2] * ramUtilizationHistory[i])+
                    (estimates[3] * bwUtilizationHistory[i]);
        }   

        Log.printLine("___________predictedUtilization: " + predictedUtilization);

        predictedUtilization *= getSafetyParameter();

        addHistoryEntry(host, predictedUtilization);

        return predictedUtilization >= 1;
    }

Как мне исправить NumberFormatException, когда я запускаю приведенный выше код, я получаю ошибку NumberFormatException. Заранее благодарим за помощь.

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Вы по какой-то причине передали результат toString() массива двойных чисел, который не является допустимым числом. Это может произойти при конкатенации строк.

Вы, вероятно, хотели вместо этого получить результат length.

0 голосов
/ 05 мая 2020
java.lang.NumberFormatException: For input string: "[D@548b7f67"
    at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
    at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
    at java.lang.Double.parseDouble(Unknown Source)
    at org.cloudbus.cloudsim.power.PowerVmAllocationPolicyMigrationLocalRegression.isHostOverUtilized(PowerVmAllocationPolicyMigrationLocalRegression.java:169)

Это говорит нам о том, что метод isHostOverUtilized пытался передать строку [D@548b7f67 в Double.parseDouble. [D@548b7f67 вообще не является допустимым двойным значением, поэтому выдает исключение.

Похоже, что произошло то, что isHostOverUtilized (или какой-то связанный метод) взял экземпляр double[] с именем .toString() на нем (что приводит к строке [D@<some garbage value here>) и передал его как есть в Double.parseDouble.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...