2013-04-25 32 views
6

Tôi tiếp tục gặp lỗi "Toán tử% không được xác định cho kiểu đối số (s) Số nguyên, Số nguyên" Tôi không chắc chắn tại sao điều này xảy ra. Tôi nghĩ rằng kể từ khi phân chia mô-đun không thể trả về số thập phân có giá trị số nguyên sẽ không sao.Phân chia mod của hai số nguyên

Điều này đang diễn ra trong một phương thức trong chương trình tôi đang tạo. Mã này là như sau:

public void addToTable(Integer key, String value) 
{ 
    Entry<Integer, String> node = new Entry<Integer, String>(key, value); 
    if(table[key % tableSize] == null) 
     table[key % tableSize] = node; 
} 

Phương pháp này là chưa hoàn thành nhưng các lỗi xảy ra tại

if(table[key % tableSize] == null) 

table[key % tableSize] = node; 

bất kỳ sự giúp đỡ hoặc đề xuất sẽ được đánh giá cao.

+1

Bạn đang sử dụng phiên bản Java nào? – durron597

+0

Nghi ngờ @ durron597 là chính xác và bạn đang sử dụng <1.5, vì vậy hãy đi với câu trả lời bên dưới. – earcam

+0

Trong Java 1.5 và 1.6, tôi có thể nhận được Integer% Integer để biên dịch thành công. – rgettman

Trả lời

7

Tôi có thể lấy một số mã mẫu Integer % Integer để biên dịch thành công trong Java 1.5 và 1.6, nhưng không phải trong 1.4.

public static void main(String[] args) 
{ 
    Integer x = 10; 
    Integer y = 3; 
    System.out.println(x % y); 
} 

Đây là lỗi trong 1.4:

ModTest.java:7: operator % cannot be applied to java.lang.Integer,java.lang.Integer 
     System.out.println(x % y); 
          ^

Lời giải thích hợp lý nhất là vì Java introduced autoboxing and autounboxing in 1.5, bạn phải sử dụng một trình biên dịch Java từ trước 1,5, nói, 1.4.

Giải pháp:

  • Nâng cấp lên Java 1.5/1.6/1.7.
  • Nếu bạn phải sử dụng 1.4, hãy sử dụng Integer.intValue() để trích xuất các giá trị int , trên đó bạn có thể sử dụng toán tử %.
+0

được nhiều người đánh giá cao @rgettman – user2268305

0

Thử chuyển đổi Số nguyên thành ints, sau đó chạy %.

if(table[key.intValue() % tableSize.intValue()] == null) 
     table[key.intValue() % tableSize.intValue()] = node; 
2

Điều này phù hợp với tôi.

Integer x = Integer.valueOf(10); 
Integer y = Integer.valueOf(3); 

int z = x % y; 

System.out.println(z); 

Không có vấn đề gì. Đầu ra:

1 

Bạn gặp phải lỗi gì? Bạn đang sử dụng phiên bản Java nào? Có vẻ như bạn đang sử dụng Java dưới 1,5.

1

Những gì bạn đang cố gắng ở đây được gọi là unboxing, tự động chuyển đổi đối tượng thành kiểu nguyên thủy (theo cách khác là tự động đóng hộp).

tài liệu Java có điều này để nói:


Trình biên dịch Java áp dụng unboxing khi một đối tượng của một lớp wrapper là:

  • Qua như một tham số để một phương pháp mà hy vọng một giá trị của kiểu nguyên thủy tương ứng.
  • Được gán cho một biến của kiểu nguyên thủy tương ứng.

Vì vậy, một khả năng là bạn không thực hiện một trong những điều đó và, mặc dù nó xuất hiện ở cái nhìn đầu tiên mà bạn đang không đi biểu mod của bạn đến một phương pháp cũng không gán nó vào một biến, nó hợp lệ, ít nhất là trong Java 6:

class Test { 
    public static void main(String args[]) { 
     Integer x = 17; 
     Integer y = 5; 
     System.out.println (x % y); 
     String [] z = new String[10]; 
     z[x % y] = "hello"; 
    } 
} 

Khả năng khác là bạn đang sử dụng môi trường Java 5 trước, nơi autoboxing và unboxing được giới thiệu.

Đặt cược tốt nhất trong trường hợp đó có thể là rõ ràng và sử dụng Integer.intValue() để xem số int cơ bản.

Tuy nhiên bạn cũng có thể muốn xem xét sử dụng một int (không Integer) cho phím và chỉ đấm bốc nó lên tại điểm mà bạn cần tới (khi bạn thêm nó vào một Entry). Nó cũng có thể nhanh hơn để sử dụng loại nguyên thủy, mặc dù bạn nên tất nhiên chuẩn nó để chắc chắn.

Các vấn đề liên quan