2015-08-04 22 views
6

Trong khi viết mã của tôi cho một nhiệm vụ hẹn hò máy tính trong đó chúng ta thấy sự tương thích của một mảng bốn đối tượng, mã của tôi in lạ. (Eclipse đã không cho tôi một lỗi/cảnh báo lúc đầu).Java: Có phải "9" xuất hiện trong khi chạy một lỗi Eclipse của tôi không?

Code:

System.out.print("Fit between " + profile1.getTitle() + " and " + profile2.getTitle() + ": \n " + 
     + '\t' + profile1.fitValue(profile2) + '\n'); 

Khi tôi cố gắng in những điều trên, họ xuất hiện như thế này:

Fit giữa Elizabeth Bennett và Elizabeth Bennett: 90,0

Fit giữa Elizabeth Bennett và Fitzwilliam Darcy: 90.55

Phù hợp giữa Elizabeth Bennett và Romeo Montague: 90,3

Fit giữa Elizabeth Bennett và Juliet Capulet: 90,0

.............................. ......................... vân vân vân vân.

Có một "9" xuất hiện trước số của tôi.

Tôi đã tìm thấy sự cố sau: Tôi đã có hai toán tử nối ("+") sau "\ n" của tôi. Vì vậy, tôi đã thay đổi mã của mình, xóa "+" không liên quan.

Code mới:

System.out.print("Fit between " + profile1.getTitle() + " and " + profile2.getTitle() + ": \n " + 
     '\t' + profile1.fitValue(profile2) + '\n'); 

mới chạy đúng:

Fit giữa Elizabeth Bennett và Elizabeth Bennett: 0,0

Fit giữa Elizabeth Bennett và Fitzwilliam Darcy: 0,55

Phù hợp giữa Elizabeth Bennett và Romeo Montague: 0.3

Fit giữa Elizabeth Bennett và Juliet Capulet: 0,0

................................ .............. vân vân vân vân.

Mặc dù tôi đã may mắn tìm thấy vấn đề của mình, tôi muốn biết chính xác điều gì đang gây ra sự cố này. Có một số loại viết tắt nhật thực dẫn đến sự xuất hiện của "9"? Hoặc là do một số lỗi nhật thực? Tôi vẫn là người mới bắt đầu ở java, vì vậy tôi không thể đưa ra một kết luận chắc chắn.

Tôi đã cố gắng thay đổi mã của tôi một chút để xem có bao Eclipse sẽ phản ứng (Tôi đã xóa khoảng cách giữa tôi gốc "+ +"):

System.out.print("Fit between " + profile1.getTitle() + " and " + profile2.getTitle() + ": \n " ++ 
     '\t' + profile1.fitValue(profile2) + '\n'); 

Eclipse đã cho tôi cảnh báo này:

Nhiều dấu tại dòng này

  • Cú pháp lỗi trên thẻ "++", + dự kiến ​​

  • .210
  • lập luận hợp lệ để hoạt động ++/-

này có ý nghĩa, bởi vì ++ ngày của riêng mình là một nhà điều hành của các loại. Thật thú vị, tuy nhiên, nếu tôi đặt dấu cách giữa "++", thì cảnh báo sẽ biến mất.

Tôi không dán toàn bộ mã của mình vì mục đích dễ đọc, nhưng nếu cần, tôi có thể chỉnh sửa và thêm mã đó vào. Một số giải thích rõ về điều này sẽ hữu ích. Cảm ơn bạn.

Trả lời

5

Sự cố không chỉ với mã số + + trong mã của bạn. Nhưng cũng có thực tế là bạn đang sử dụng char'\t' và không phải Chuỗi"\t".

Vì vậy, khi bạn sử dụng System.out.println("Hello" + '\t');, \t được lấy làm ký tự theo nghĩa đen và được thêm vào chuỗi là \t.

Nhưng khi bạn sử dụng System.out.println("Hello" + + '\t');, nó sẽ trở thành hiệu quả System.out.println("Hello" + (+ '\t'));. Vì vậy, nó được xem như là một int bởi java. Bạn chỉ gán các dấu hiệu +- vào ints chứ không phải ký tự.

Hãy nhớ rằng bạn có thể làm int i = +2 hoặc -2 hoặc + +2.

Và giá trị ASCII là \t9. Do đó nó được nối thêm vào chuỗi và được in dưới dạng Hello9.

+0

Bạn đang nhận thêm ở đâu '\ n' ở đó? –

+0

@Jon sửa chữa nó. Nếu '\ n' ở đó,' 9' sẽ được in trong một dòng mới. – Codebender

+0

@jWeaver, Bạn đã hiểu lầm. '\ n' không có mặt thay vì' \ t'. Kiểm tra chỉnh sửa của tôi, bạn sẽ hiểu. – Codebender

6

Không, đó không phải là lỗi. Nó không bình thường, nhưng nó không phải là một lỗi.

Điều đầu tiên cần làm là đơn giản hóa ví dụ ồ ạt:

public class Test { 
    public static void main(String[] args) { 
     String start = "Start"; 
     String end = "End"; 
     System.out.println(start + '\t' + end); 
     System.out.println(start + +'\t' + end); 
    } 
} 

Kết quả:

Start End 
Start9End 

Bây giờ phải thừa nhận là tôi đang sử dụng chuỗi cho cả startend, nhưng do + bị bỏ lại - không có sự khác biệt ở đây. (Nếu start là một số nguyên, nhị phân + điều hành đầu tiên sẽ là bổ sung số nguyên trong cả hai trường hợp.)

Về cơ bản, thêm + kết thúc lên được một unary + operator với '\t' như các toán hạng.Unary numeric promotion được áp dụng cho số char, cho kết quả là int. Vì vậy, các mã trở nên có hiệu quả:

System.out.println(start + +((int)'\t') + end); 

đó là một cách hiệu quả:

System.out.println(start + +(9) + end); 

đó là một cách hiệu quả

System.out.println(start + 9 + end); 

... lúc này nó là hy vọng rõ ràng lý do tại sao bạn đang nhận được đầu ra bạn là.

Để tránh vô tình kết thúc điều trị một nhân vật như một số nguyên, nó có thể là tốt nhất để chỉ cần sử dụng chuỗi thay vì - lúc này mã sẽ không biên dịch vì không có + hành unary cho String:

System.out.println(start + +"\t" + end); 

... cung cấp cho:

Test.java:6: error: bad operand type String for unary operator '+' 
1

Bạn đang sử dụng char\t và không phải là chuỗi "\t" với các nhà điều hành + vì vậy nó được sử dụng ascii numeric value of 9 cho tab

nên

System.out.println("\n"+ +'\t'); 

cũng giống như

System.out.println("\n"+ (+9)); 
0

Tôi không nghĩ rằng đây là một vấn đề với nhật thực toàn phần. Nó hoạt động theo cùng một cách trên giao diện điều khiển cũng. + '\ T' được coi là giá trị số nguyên 9 bởi Java không phải là ký tự.

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