2013-09-02 4 views
1

Перед тем, как разметить этот дубликат, пожалуйста, посмотрите на код, как это делается иначе, чем на другие вопросы, и я был бы признателен за исправление, связанное с этим кодом. Это в значительной степени калькулятор, который принимает два числа, и оператор затем печатает окончательное число (и, если применимо, остаток). Я получаю ошибки:Ошибка Java Calculator

The local variable num3 may not have been initialized 

The local variable rem may not have been initialized 

Вот код:

import java.util.Scanner; 

public class JCalc { 

public static void main(String[] args) { 
    Scanner myScanner = new Scanner(System.in); 
    int num1; 
    int num2; 
    int num3; 
    int rem; 

    System.out.println("Welcome to JCalc! The best calculator ever!"); 
    System.out.print("Please enter the first number: "); 

    num1 = myScanner.nextInt(); 

    System.out.print("Please enter the second number: "); 

    num2 = myScanner.nextInt(); 

    System.out.print("Please enter an operator (+, -, %, *): "); 

    String op = myScanner.next(); 

    if (op == "+") { 
     num3 = num1 + num2; 
    } 

    if (op == "-") { 
     num3 = num1 - num2; 
    } 

    if (op == "%") { 
     num3 = num1 - num2; 
     rem = num1 % num2; 
    } 

    if (op == "*") { 
     num3 = num1 * num2; 
    } 
    System.out.print("The answer is: "); 
    System.out.print(num3); //error 

    if (op == "%") { 
     System.out.print(" with a remainder of "); 
     System.out.println(rem); //error 
    } 






} 

} 

Последние 2 Кронштейны получили немного перепутались, когда я копировать вставить их (извините). Цените всю помощь, которую я могу получить!

+0

@MadProgrammer Как это дубликат? Он не спрашивает о сравнении строк – hotforfeature

+0

@abmitchell Да, я знаю, видел код сравнения «String» и вскочил на него, мой плохой. Но как только мы решаем вопрос, о котором его просто спрашивают, они тоже попадут в эту проблему: P – MadProgrammer

ответ

1

Компилятор не является лучшим при следующих нескольких условиях. Я хотел бы изменить:

int num3; 
int rem; 

в

int num3=0; 
int rem=0; 

Теперь они будут безоговорочно инициализируется. В принципе, вы не можете присвоить локальные переменные, хотя поля классов в порядке.

В любом случае, вы должны использовать equals( для строк. Используйте if("+".equals(op)) и такие.

+0

Но когда я ставлю = 0, он делает все мои уравнения = 0. Что я делаю не так? –

+0

@TheBoss Прочитайте последнюю строку моего сообщения. Не используйте '==' для сравнения строк. Вместо этого используйте 'if (op.equals (" + ")) и такие. – hexafraction

+0

(Nit pick) '" + ". Equals (op)', чтобы избежать возможного 'NullPointerException';) – MadProgrammer

0

Обе переменные должны быть инициализированы значением по умолчанию, это предупреждение компилятора.

num3 никогда не назначается за пределами оператора if, поэтому технически он никогда не может быть назначен (в глазах вашего компилятора). Это нехорошо, поэтому он выдает это предупреждение, то же самое с rem.

Он не бросает предупреждения для двух других, так как они принудительно назначены методом блокирования Scanner.nextInt()

1

В Java, все локальные переменные должны быть объявлены прежде чем они могут быть использованы. Основная форма декларации переменной показана здесь:

type identifier [ = value][, identifier [= value] ...] ; 

Тип является одним из типов данных Java. Идентификатор - это имя переменной. Чтобы объявить несколько переменных указанного типа, используйте список, разделенный запятыми.

double pi = 3.14159; // declares an approximation of pi. 
char x = 'x';  // the variable x has the value 'x'. 
  1. local variables
  2. local variables

Используйте функцию String.equals(String other) для сравнения строк, а не оператор ==.
== сравнивает ссылку переменной, где .equals() сравнивает значения, которые вы хотите.

  1. string comparison
+2

* «все переменные должны быть объявлены до их использования *» - Не верно. Переменные экземпляра инициализируются значением по умолчанию JVM-Nit, чтобы быть уверенным;) – MadProgrammer

+0

@MadProgrammer: Спасибо, сэр. –

+0

Нет никакого вреда в установке значения по умолчанию для переменной экземпляра, но это не всегда требуется;) – MadProgrammer

0

String сравнение не делается с помощью механизма ==.Это сравнивает адреса памяти объектов, а не их содержание

Вместо этого используйте "+".equals(op) вместо

См How do I compare strings in Java? для более подробной информации

Java не делает gurentees к тому, что значения присваиваются локальным переменным. Это означает, что, конечно, вы всегда должны назначать свои собственные значения по умолчанию, например.

int num1 = 0; 
int num2 = 0; 
int num3 = 0; 
int rem = 0; 
0
  1. инициализировать переменные

    INT num3 = 0; int rem = 0;

  2. Сравните свою строку с помощью метода equals().

Сравните переменную 'op' с помощью метода equals() вместо '=='.

if (op.equals("+")) {} 

Или, если вы хотите использовать «==» себя сравнивать, то воспользоваться помощью метода стажера().

if (op.intern() == "+") {} 
+1

(Nit Pick), но я лично использовал бы «+». Equals (op) ', поскольку он избегает возможности« NullPointerException' – MadProgrammer

+0

@MadProgrammer, что верно; полезное предложение. –