forked from IOOPM-UU/ioopm16
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CommonCompilerErrors.java
195 lines (149 loc) · 6.79 KB
/
CommonCompilerErrors.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
public class CommonCompilerErrors {
// Denna kodfil visar exempel på fem vanliga kompileringsfel:
//
// 1. Tilldelning från värde av felaktig typ
// 2. Anrop av metod med parameter-värde av felaktig typ
// 3. Användning av en klass som antingen är felstavad eller inte har importerats
// 4. Användning av variabel som inte finns (i regel stavfel)
// 5. Anrop till metod som inte finns (i regel stavfel eller fel mottagartyp, inklusive fel parameterantal)
//
// Du kan inte köra detta program. Det är till för att kompileras. LÄS SLUTET AV FILEN FÖR MER INFORMATION.
}
class ErrorOne {
Object source = "Jag är en sträng, men f skulle kunna peka ut vad som helst!";
String sink = source; // Ger kompileringsfel av typ 1 ovan
/*******************************************************************************
Kompilatorn säger:
CommonCompilerErrors.java:15: error: incompatible types: Object cannot be converted to String
String sink = source; // Ger kompileringsfel av typ 1 ovan
********************************************************************************/
// Förklaring:
// Source har en mer generell typ än sink, dvs. source skulle kunna tilldelas ett
// värde som inte är en sträng. För att undvika att programmet någonsin kraschar
// på grund av detta tillåter vi inte tilldelning från source till sink.
//
// Generell regel för tilldelning:
// Låt T1 vara typen på source,
// Låt T2 vara typen på sink
// för att sink = source skall vara tillåtet måste T1 <: T2 hålla, dvs.
// T1 måste vara en *subtyp* av T2.
//
// Innan vi går in på interface betyder detta att något av följande skall gälla:
// - T1 == T2 (typerna är samma)
// - T1 ärver av T2 i något led
//
}
class ErrorTwo {
void methodTakingTwoArguments(Object p1, String p2) { /* do nothing for now */ }
void hereIsWhereTheErrorIs() {
Object a1 = null;
String a2 = null;
this.methodTakingTwoArguments(a2, a1);
/*******************************************************************************
Kompilatorn säger:
CommonCompilerErrors.java:48: error: incompatible types: Object cannot be converted to String
this.methodTakingTwoArguments(a2, a1);
********************************************************************************/
}
// Förklaring:
// Ovan uppstår problemet förmodligen på grund av att a1 och a2 står i omvänd ordning.
// Att anropa methodTakingTwoArguments och skicka in a1 som argument till parametern
// p2 är fel av exakt samma problem som i ErrorOne, dvs. p2 = a1 fungerar inte.
}
class ErrorThree {
LinkedList myList;
/*******************************************************************************
Kompilatorn säger:
CommonCompilerErrors.java:66: error: cannot find symbol
LinkedList myList;
^
symbol: class LinkedList
location: class ErrorThree
********************************************************************************/
// Förklaring:
// För att få tillgång till typen LinkedList måste vi importera den. Det kan vi göra
// på två sätt:
//
// import java.util.LinkedList;
// import java.util.*;
//
// Båda satserna bör stå högst upp i filen där vi vill använda klassen.
//
// Det fösta importerar endast LinkedList-klassen från paketet java.util. Det andra
// importerar alla klasser från java.util.
Error3 foo = null;
/*******************************************************************************
Kompilatorn säger:
CommonCompilerErrors.java:90: error: cannot find symbol
Error3 foo = null;
^
symbol: class Error3
location: class ErrorThree
********************************************************************************/
// Förklaring:
// Klassens namn är felstavat. ErrorThree, inte Error3.
}
class ErrorFour {
void methodTakingTwoArguments(Object p1, String p2) { /* do nothing for now */ }
void hereIsWhereTheErrorIs() {
Object descriptiveVariableName = null;
String anotherDescriptiveVariableName = null;
this.methodTakingTwoArguments(descriptiveVariableName, anohterDescriptiveVariableName);
/*******************************************************************************
Kompilatorn säger:
CommonCompilerErrors.java:113: error: cannot find symbol
this.methodTakingTwoArguments(descriptiveVariableName, anohterDescriptiveVariableName);
^
symbol: variable anohterDescriptiveVariableName
location: class ErrorFour
********************************************************************************/
}
// Förklaring:
// Vi har stavat fel till det andra argumentet ('h' och 't' har bytt plats).
}
class ErrorFive {
void methodTakingTwoArguments(Object p1, String p2) { /* do nothing for now */ }
void hereIsWhereTheErrorIs() {
Object a1 = null;
String a2 = null;
// Fel 1:
this.methodTakingOneArguments(a1);
/*******************************************************************************
Kompilatorn säger:
CommonCompilerErrors.java:140: error: cannot find symbol
this.methodTakingOneArguments(a1);
^
symbol: method methodTakingOneArguments(Object)
********************************************************************************/
// Fel 2:
this.methodTakingTwoArguments(a1);
/*******************************************************************************
Kompilatorn säger:
CommonCompilerErrors.java:153: error: method methodTakingTwoArguments in class ErrorFive cannot be applied to given types;
this.methodTakingTwoArguments(a1);
^
required: Object,String
found: Object
reason: actual and formal argument lists differ in length
********************************************************************************/
}
// Förklaring fel 1:
// Metodens namn är felstavat. Det finns ingen sådan metod.
// Förklaring fel 2:
// Metoden förväntar sig två argument men får endast ett.
}
/*******************************************************************************
Låt oss dissekera kompilatorns felmeddelanden:
Först information om var felet är:
<Filnamn.Java>:<Radnummer>: error: <Beskrivning av felet>
<information om var det uppstår>
<övrig hjälpinformation om tillämpligt>
Titta igen på det sista felet som visar här. Om man läser det i lugn och ro får man
faktiskt ut all information.
CommonCompilerErrors.java:153: error: method methodTakingTwoArguments in class ErrorFive cannot be applied to given types;
this.methodTakingTwoArguments(a1);
^
required: Object,String
found: Object
reason: actual and formal argument lists differ in length
********************************************************************************/