2015-10-24 9 views
0

Мой код отлично работает, но это то, что убивает меня, и я не могу найти ответ. Я не могу передать строку непосредственно из аргументов командной строки в свой конструктор, чтобы затем передать метод (метод оценки), который вызывается во время построения. По какой-то причине метод не видит его как String. Почему он это делает? Единственный способ заставить его работать - это поставить if/else в мой основной метод, который вызывает конструктор и передает аргументы. Прикрепленный мой код.java command line не распознает строку

/** 
* Program to calculate approximation, actual value, absolute error, and relative error with a definite integral 
* @author c-dub 
* 
*/ 
public class Integrate { 
    private String whichWay; 
    double upper, lower, deltaX, actual, absoluteError, relativeError; 
    int rect; 

    // Constructor 
    Integrate(String str, double a, double b, int n) { 
     this.whichWay = str; 
     this.lower = a; 
     this.upper = b; 
     this.rect = n; 
     this.deltaX = (b - a)/rect; 
     this.actual = (Math.pow(upper, 3)/3) - (Math.pow(lower, 3)/3); 
     evaluateMethod(whichWay); 
     System.out.println("Actual value: " + actual); 
     System.out.println("Absolute error: " + absoluteError + ", Relative error: " + relativeError + "."); 
    }  

    /** 
    * Evaluates all calculations 
    * @param whichWay, the string to determine left, right, trapezoid method 
    */ 
    private void evaluateMethod(String whichWay) { 
     if(whichWay == "l" || whichWay == "L") { 
      System.out.println("Using left hand endpoints, on the integral (" + lower + ", " + upper + ") with " 
           + rect + " rectangles....."); 
      System.out.println("The approximate value is: " + integrateLeft() + ".");   
     } 
     else if(whichWay == "r" || whichWay == "R") { 
      System.out.println("Using right hand endpoints, on the integral (" + lower + ", " + upper + ") with " 
           + rect + " rectangles....."); 
      System.out.println("The approximate value is: " + integrateRight() + ".");   
     } 
     else if(whichWay == "t" || whichWay == "T") { 
      System.out.println("Using the trapezoid method, on the integral (" + lower + ", " + upper + ") with " 
           + rect + " rectangles....."); 
      System.out.println("The approximate value is: " + integrateTrapezoid() + ".");   
     } 
     else { 
      throw new IllegalArgumentException("Bad string input. Please restart program"); 
     } 
    } 

    /** 
    * Left hand endpoint integration 
    * @return the approximate value as a double 
    */ 
    private double integrateLeft() {   
     double sum = 0; 
     // First interval to the last interval, depending on number of rectangles 
     double lowerAlt = lower; 
     for(int i = 0; i < rect; i++) {   
      sum += evaluate(lowerAlt); 
      lowerAlt = lowerAlt + deltaX; 
     } 
     absoluteError = Math.abs(actual - (sum * deltaX)); 
     relativeError = Math.abs(absoluteError/actual); 
     // Multiply entire sum by deltaX 
     return Math.abs(sum * deltaX); 
    } 

    /** 
    * Right hand endpoint integration 
    * @return the approximate value as a double 
    */ 
    private double integrateRight() { 
     double sum = 0; 
     // First interval to the last interval, depending on number of rectangles 
     double lowerAlt = lower + deltaX; 
     for(double i = 0; i < rect; i++) { 
      sum += evaluate(lowerAlt); 
      lowerAlt = lowerAlt + deltaX; 
     } 
     absoluteError = Math.abs(actual - (sum * deltaX)); 
     relativeError = Math.abs(absoluteError/actual); 
     // Multiply entire sum by deltaX 
     return Math.abs(sum * deltaX); 
    } 

    /** 
    * Trapezoid method of integration 
    * @return the approximate value as a double 
    */ 
    private double integrateTrapezoid() { 
     double sum = 0; 
     // first interval after the lower bound, to the last interval before upper bound depending on # of rectangles 
     double lowerAlt = lower + deltaX; 
     for(int i = 1; i < rect; i++) { 
      sum += evaluate(lowerAlt) * 2; 
      lowerAlt = lowerAlt + deltaX; 
     } 
     // Now pass the lower and upper values into the function and add to total sum 
     sum += evaluate(lower) + evaluate(upper); 
     absoluteError = Math.abs(actual - (sum * (deltaX/2))); 
     relativeError = Math.abs(absoluteError/actual); 
     // Mulitply calculation by deltaX/2 
     return Math.abs(sum * (deltaX/2)); 
    } 

    /** 
    * Method to define the actual function 
    * @param x, function input value 
    * @return the function output value f(x) 
    */ 
    private double evaluate(double x) { 
     //Please enter your desired function here: 
     return Math.pow(x, 2); 
    } 


    /** 
    * Main method 
    * @param args, the command line arguments 
    */ 
    public static void main(String[] args) { 
     String str; 
     double a = Double.parseDouble(args[1]); 
     double b = Double.parseDouble(args[2]); 
     int n = Integer.parseInt(args[3]); 
     if(args[0].equals("l") || args[0].equals("L")) { 
      new Integrate("l", a, b, n); 
     } 
     else if(args[0].equals("r") || args[0].equals("R")) { 
      new Integrate("r", a, b, n); 
     } 
     else if(args[0].equals("t") || args[0].equals("T")) { 
      new Integrate("t", a, b, n); 
     }  
     } 
} 

Внутри моего метода evaluateMethod(), он проверяет строку, и даже если команда арг проезжал в законном струнном письме (не полукокс), оно не было видеть его как строку и бросать исключение. Благодаря

+0

Возможно, это немного поздно, но я не вижу исключения в вашем вопросе? –

+1

Возможный дубликат [Как сравнить строки в Java?] (Http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) –

+0

@ ᴳᵁᴵᴰᴼ Этот пример сравнивает вход с равно. ваш «дубликат» не –

ответ

0

В вашем изменении evaluateMethod() whichWay == "л" с whichWay.equals ("L"), как в основной():

private void evaluateMethod(String whichWay) { 
     if(whichWay.equals("l") || whichWay.equals("L")) { 
      System.out.println("Using left hand endpoints, on the integral (" + lower + ", " + upper + ") with " 
           + rect + " rectangles....."); 
      System.out.println("The approximate value is: " + integrateLeft() + ".");   
     } 
     else if(whichWay.equals("r") || whichWay.equals("R")) { 
      System.out.println("Using right hand endpoints, on the integral (" + lower + ", " + upper + ") with " 
           + rect + " rectangles....."); 
      System.out.println("The approximate value is: " + integrateRight() + ".");   
     } 
     else if(whichWay.equals("t") || whichWay.equals("T")) { 
      System.out.println("Using the trapezoid method, on the integral (" + lower + ", " + upper + ") with " 
           + rect + " rectangles....."); 
      System.out.println("The approximate value is: " + integrateTrapezoid() + ".");   
     } 
     else { 
      throw new IllegalArgumentException("Bad string input. Please restart program"); 
     } 
    } 

Поскольку сравнивать строковое значение, вы должны использовать эта функция. (Смотрите в документации)

== тесты на равенство ссылок

.equals() тесты на значение равенства

+0

спасибо всем. его глупые небольшие ошибки, подобные этой, которую я хочу предотвратить. Theres не нужно иметь, если/else заявления в моем основном методе больше. Цените помощь. –

0

В evaluateMethod() метод, который вы используете ==, когда вы должны использовать .equals()

Например

if(whichWay == "l" || whichWay == "L") 

должно быть:

if(whichWay.equals("l") || whichWay.equals("L") 

замените все ваши сравнения строк на .equals("[Letter]"), и он должен работать.

Интересно, что в NetBeansIDE ваша программа работает нормально. Он просто предупреждает об этой ошибке.