Я казаў на гэтую тэму ў 1997-11 у Каларада канферэнцыі на вышэйшым узроўні, а затым у 1999-11.
| Непаслядоўнасць пашырэнняў | ||
|---|---|---|
| Дзе | Пашырэнне Абавязковае? | Прыклад |
| складанне | mandatory | CD \MyDir javac.exe -classpath . HelloWorld.java |
| executing | must exclude | CD \MyDir java.exe -classpath . HelloWorld |
| Applet | mandatory | <applet code="HelloWorld.class" width="230" height="240"> <img src="image/NoJava4U.jpg"> </applet> |
C/C++ programmers will attempt to write code like
if ( width ) { widen( width ); } if ( myDog ) { myDog.bark(); }Вы павінны гэтыя загаворы з звычайнае ліст у Java:
if ( width != 0 ) { widen( width ); } if ( myDog != null ) { myDog.bark(); }
However, for
if ( tooWide ) { widen( width ); }
Beware, you
if ( tooWide = true ) { widen( width ); }Звярніце ўвагу: што = вышэй, аператар прысвойвання, а не == аператар параўнання. Калі заўсёды праўдзіва.
З праграмісты знаёмыя з гэтым, але тых, хто прыбывае з моў распрацавана прафесарам Віртам будуць задыхацца ў здзіўленні
switch ( k ) { case 1: System.out.println( "hello" ); case 2: System.out.println( "hi" ); }Калі да 1, праграма выведзе як "прывітанне" і "прывітанне". Справа становішча падзення, хоць па змаўчанні. Вы не будзеце атрымліваць памылкі сінтаксісу ці нават папярэджанне, калі вы пакінеце з перапынак пасля кожнага выпадку.
Паколькі сінтаксіс для вызначэння выпадкаў і этыкеткі так падобны, гэта лёгка зрабіць памылку, як гэта: праграміст з левага прасторы і, замест апрацоўкі п == 3, ён вызначыў перайсці да пункта называецца case3 ў сваёй заяве пераключальніка.
У Java версіі 1.4 або больш позняй версіі Вы можаце выкарыстоўваць javac.exe-Xswitchcheck атрымаць кампілятар папярэдзіць вас, калі вы робіце гэта. Аднак, няма сінтаксісу сказаць Java, калі вы мелі на ўвазе, каб зрабіць гэта наўмысна, напрыклад, выпадку перапынку або Правальваемся ключавое слова.//String.Replace выпускае новую радок. Ён не змяняе арыгінальны. // Since String is immutable, no method can modify the original. String aa = "peal"; String bb = aa.replace( 'a', 'e' ); System.out.println ( aa + " " + bb ); // Prints "peal peel" not "peel peel" // Newbies often expect String aa to be changed too.String. Замяніць не змяняе ўваходны радка. Ён не мог, нават калі ён хацеў, так як String S з'яўляюцца нязменнымі. Акрамя таго, Javadocs для замены растлумачыць, што замяніць стварае новую радок.
//На жаль, НЕ РАБІЦЕ ГЭТАГА! кампанент). SetFont (новы шрыфт ("Дыялог", 12, тоўстым шрыфтам.); // do this instead: component.setFont( new Font( "Dialog", Font.BOLD, 12 ));
Шрыфт. CreateFont вырабляе шрыфта 1 бал высокі, занадта малы, каб бачыць. Вы павінны выкарыстоўваць шрыфт. DeriveFont перш чым вы зможаце выкарыстоўваць яго.
Вы павінны ставіцца да прымітывы як аб'екты для іншай мэты - так, што вы можаце змясціць іх у кантэйнеры, такія як ArrayList S або вектара s. У Java, вы павінны ўручную абгарнуць прымітыўных ў аб'ект. Нд падае набор нязьменных класаў абгорткі аб'ект пад назвай: Byte, Short, характар ??(не Char), Integer (не Int), Float і Double, той жа класах, што ваш дом статычныя метады для махінацый з прымітываў! Гэта можа быць ясней, калі б яны назвалі гэтыя класы імёны, як ImmutableByte або ByteWrapper, але яны гэтага не зрабілі. Вы не можаце змяніць значэнне прымітыўных ўнутры любога з гэтых аб'ектаў абалонкі. Усё, што вы можаце зрабіць, гэта стварыць новы аб'ект з новым нязменныя прымітыўных сядзіць усярэдзіне.
Каб пытанні ўсё больш заблытанай, клас двайны затым падвойную працу, каб мець справу як з падвойным прымітываў і двайны абалонкай аб'ектаў. Напрыклад метады двайны маніпуляваць Падвойны аб'екты і статычныя метады для двайнога маніпуляваць двайны прымітываў. Гэтыя метады, натуральна, падобнымі, калі не ідэнтычныя імёны! Тая ж праблема ўзнікае для ўсіх іншых прымітыўных/клас пар, але большасць пачаткоўцаў, здаецца, спатыкнуцца спачатку
double d; /* double primitive */ Double dd; /* Double wrapper */ String g; g = Double.toString( d ); /* double primitive */ g = dd.toString(); /* Double wrapper */Глядзіце пераўтварэнні за дапамогу ў interconverting розных прымітываў і абгорткі.
Пры ўсталёўцы па змаўчанні ToString, вы проста атрымаеце імя класа і хэш-код аб'екта, які выглядае як трызненне, напрыклад, [C @ ad3ba4.
char[] c = { 'a' , 'b' , 'c'}; System.out.println( c.toString() );will print out the address of c, not the characters that compose it. You must use newString ( char[] ) to convert a масіў сімвалаў ў радок.
Label.toString () не з'яўляецца псеўданімам для Label.getText (). Яна выведзе з рэзюмэ палёў Label так: java.awt.Label [label0, 0,0,0 x0, несапраўднымі, ALIGN = LEFT, тэкст = DEF]
Як жа тады вы пераўтварыць у String? З салянку з метадаў, якія могуць супернічаць французскіх дзеясловаў для парушэнняў.
String x = "foo" + 's';In Java version 1.6 or later, x is "foos". У пачатку Java версіі 1.2 гэта "foo115", але быў прызначаны на версію.
Хоць канструктар падобны на статычны метад, які вяртае новы аб'ект, вы не можаце аб'явіць канструктар статычныя. Гэта не з'яўляецца статычным, так як ён працуе на канкрэтны аб'ект па змаўчанні. Гэта вызначана ў канструктар.
Калі любая з гэтых рэчаў, кампілятар думаеце, што ваш канструктар проста звычайным метадам. Вы будзеце збянтэжаныя скаргаў кампілятар аб тым, што вы не вызначылі падыходны канструктар, каб адпавядаць аргументы, якія вы дае.
Гэта можа дапамагчы, калі вы разумееце, што новы вылучае/стварае аб'ект і канструктар ініцыялізуе яго. Таму канструктара няма неабходнасці вяртання аб'екта.
Калі вы не дае ніякіх канструктараў на ўсіх, Java будзе аўтаматычна даваць Вам канструктар па змаўчанні
public MyClass() { super(); }\Аднак, калі вы амбіцыйныя і напісаць дадатковы канструктар, скажам так:
прыватных MyClass (INT fudgicles) { . Гэтага fudgicles = fudgicles; }Канструктар па змаўчанні знікне! Вы павінны затым прадставіць яму сябе ў відавочным выглядзе.
Хутчэй за ўсё, вы сутыкнецеся гэтай праблемы, калі вы бачыце наступнае паведамленне пра памылку:
У ангельскай мове гэта значыць, вам не хапае змаўчанні адчынены канструктар для вашага аплета. Глядзіце канструктар.
Новыя Hex Unicode тэхніка "\ u003f" мае злавіць. Ён не прызначаны для кадавання сімвалаў кіравання. Яна ацэньваецца ў праход папярэдняй апрацоўкі і ператвараецца ў сімвал, то кампіляцыі кода. Калі, напрыклад, піша "\ u000A", гэта будзе аўтаматычна пералічаныя для:
" "Так як \ u000A канвертуецца ў сімвал новай радкі. Гэта дакладна не будзе працаваць для Cr і Lf. Гэта можа працаваць для некаторых іншых сімвалаў кіравання ў некаторых кампілятараў. Я прапаную выкарыстоўваць васьмярковым формы для бяспекі.
Кожны
double x = 90; double y = sin( x ); double z = tan( x + PI );І глядзіць і глядзіць на яго цікава, чаму яна не будзе працаваць. Вам трэба напісаць аб гэтым так:
// converting degrees to radians, manually. static final double CONVERT_DEGREES_TO_RADIANS = Math.PI / 180; double x = 90 * CONVERT_DEGREES_TO_RADIANS; double y = Math.sin( x ); double z = Math.tan( x + Math.PI );Ёсць тры месцы на паездку да:
//Убудаваны ў радыянах <-> метады градусаў. адкрытыя статычныя двайны toDegrees (двайны angleInRadians); адкрытыя статычныя двайны toRadians (двайны angleInDegrees);
Акрамя таго, кожны раз, калі вы з якая плавае кропкай разліку, вы губляеце трохі дакладнасці. Усё гэта стварае.
У Java 5.0 вам больш не трэба, як мат. У гэтым мат. Граху () да тых часоў, як вы дадаеце імпарту:
імпарт статычных Java.. мат Lang;
//Сігнал на дынамік кампутара, пасылаючы сімвал BEL на кансоль Сістэма ".) З. Print ("\007; Сістэма (.) З. Западліцо;Ён ігнаруе '\' у кансолі, хоць вы можаце выкарыстоўваць \ 007, каб атрымаць бел.
Вы можаце зрабіць просты гукавы сігнал з Інструментарый. GetDefaultToolkit (). Beep () . Я бачыў, пра тое, што гукавы сігнал не працуе належным чынам на некаторых платформах.
//Сігнал праз кансоль Сістэма ".) З. Print ("\007; Сістэма (.) З. Западліцо; //Сігнал праз інструментарый Toolkit (. GetDefaultToolkit ()). Гукавы сігнал;Вы таксама можаце гуляць AU, WAV, MIDI і AIFF файлы з AudioClip.play.
Вы можаце паглядзець доўгі час праз java.io. * спрабуе знайсці каталог аперацый, перш чым вы знойдзеце іх хаваецца ў файле класа напрыклад, спіс каталогаў, каб даведацца файлы
File dir = new File( "C:\\" ); String[] files = dir.list();
won’t
File dir = new File( "C:\\." ); String[] files =dir.list();Памятайце, што "\" у Java радкоў павінна быць напісана як "\\".
Гэта робіць чытанне радкоў, якія прадстаўляюць імёны файлаў у зман. Unix сістэмы выкарыстоўваюць "/" Шлях падзельнік замест "\". Макінтошы выкарыстоўваць ":" і ёсць цікавыя павароты як "::" на тэрмін да замест "/../" як у Unix. Каб напісаць незалежны ад платформы код, вы павінны выкарыстоўваць ўласцівасці file.separator сістэмы і path.separator, або выкарыстоўваць Файл метады, якія пабудаваныя імёнаў для вас ад часткі.
Тады
Файл [] каранёў = Файл). ListRoots (;
для: ярка выяўленая для кожнага з'яўляецца скарачэнне працяг на рэгулярнай для. Гэта дазваляе перабраць-итераторов, калекцыя S і масіваў з кароткім сінтаксісу. Аднак, ён не дазволіць вам перабору знакаў радкі або дазваляюць атрымліваць доступ да індэксу, як і вы з рэгулярнымі для, толькі значэння. Паглядзіце на наступны прыклад, каб убачыць, што я маю на ўвазе:
for ( long i=Long.MAX_VALUE -2; i<=Long.MAX_VALUE; i++ ) { /*...*/ }Колькі раз, што для завесы выканаць? Пакуль вы не забіць працэс! Гэта будзе цыкл бясконца, таму што я ніколі не можа атрымаць больш, чым Long.MAX_VALUE спыніць цыкл. Ёсць аналагічныя праблемы з Integer.MAX_VALUE, Long.MIN_VALUE і Integer.MIN_VALUE. Вы прывыклі да думкі аб верхнім мяжы лагічнай пункту прыпынку, дзе кананічныя для завесы фактычна спыніцца на адным мінулым, што значэнне. Прычына завесы не спыняе з'яўляецца Java цэлалікавай арыфметыка дазваляе перапаўнення, як звычайна. Прычынай гэтага з'яўляецца большасць абсталявання паводзіць сябе такім чынам і многае трохі дробязны будзе занадта складанай, калі перапаўненне кінуў выключэння. Вы можаце звяртацца выяўленне лікаў становіцца занадта вялікім з сцвярджаюць, які ловіць праблемы задоўга да таго, яны блізкія да перапаўнення 32 або 64 біта.
Зірніце на крыніцу java.lang.String.toUpperCase (). Можна было б чакаць, каб яно ўтрымлівала
if ( 'a' <= theChar && theChar <= 'z' ) theChar -= ('a' -'A' );Аднак, вы адкрыеце для сябе код даволі развіты. Напрыклад, ён правярае, ці з'яўляецца бягучая лакаль турэцкіх тэлефанаваць спецыяльны код, каб справіцца з dotless I. Гэта тэсты для нямецкіх СС і пераўтворыць яго ў пару літар "СС"! Калі вы працуеце толькі з ангельскай мовай, вы можаце згарнуць уласны больш рацыянальны варыянт. Калі ўзяць радок у ніжні рэгістр затым назад у верхні рэгістр затым назад у ніжні рэгістр, вы не абавязкова канчатковым выніку, калі вы пачалі.
У іншых мовах, для вымання падрадка, вы даеце зрушэнне дзе радок пачынаецца і даўжыня ў сымбалях. У Java, вы дае два нуля зрушэння. Першы паказвае на пачатак радка, як і варта было чакаць, і
"abcdefg".substring( 3, 5 ) gives "de". "abcdefg".substring( 3, 7 ) gives "defg". "abcdefg".substring( 3, 8 ) gives StringIndexOutOfBoundsException.
Калі паказаць зрушэння, якія знаходзяцца па-за абалонкі радкі, вы не атрымаеце усечаных або пусты радок; вы падымае StringIndexOutOfBoundsException. Адзін са спосабаў памятаю, як яна працуе, што вы паказаць першы знак ўключыць і першы знак выключыць. Але не зусім. Вы маеце права быць ледзь мінулым канца.
"emptiness".substring( 9 )returns "" (an empty string)
"emptiness".substring( 10 )дае StringIndexOutOfBoundsException
Чаму гэта так?
Then:
s = "APPLE".substring( 1, 4 ); // gives "PPL". s = "APPLE".substring( 3, 3 ); // gives "". s = "APPLE".substring( 0, 5 ); // gives "APPLE".Сцеражыцеся выкарыстання падрадок толькі з адным аргументам.
String хвост = х). Падрадок (endindex;
атрымлівае вас хвасце радкі, пачынаючы з endindex. Гэта не вам пачатак
= Х. Кіраўнік падрадок (0, даўжыня);атрымлівае вас першая частка радка, першыя літары даўжыні.
Пры дзяленні на нуль з падвойным, атрымаць квадратны корань з адмоўнага ліку, перапаўненне максімальна прадстаўляльная г.д. значэнне вынік магічнае лік называецца Double.NaN, Double.POSITIVE_INFINITY або Double.NEGATIVE_INFINITY. Вы
калі (Double. IsNaN (D))
або з Double. IsInfinite . Вы не можаце праверыць
калі (г == двайны. NaN)
Паколькі Існуюць два розных густаў НАН, двайны. POSITIVE_INFINITY і Double. NEGATIVE_INFINITY Вы не можаце непасрэдна параўнаць == двайны. NAN для праверкі НАН. Аднак, вы можаце адразу параўнаць == двайны;. НАН Аднак, вы можаце выкарыстоўваць Double. IsNaN або == параўнаць з падвойным. POSITIVE_INFINITY. Існуе адпаведны паплавок. NaN і Float. IsNaN Тэорыя прыняцця NaN не роўны самому сабе дазваляе хутка і брудны спосаб для праверкі разлікаў будзе неабгрунтаванай.
if ( result != result ) { System.out.println( "oops" ); }
Беражыся
Праблема ў тым, StringBuffer. Роўная правярае дзве спасылкі паказваюць на той жа StringBuffer, тое, што вы амаль ніколі не хочуць рабіць. StringBuilder мае той жа Гоча.int[] intArray = null; String.valueOf( intArray ); // produces the String "null" char[] charArray = null; String.valueOf( charArray ); // throws NullPointerException
Апошняе, што рэч = новая рэч (7); рэч = otherThing // генеруе памылку кампіляцыі рэч;. SetSize (10) //OK рэч;. абхапілі = 6 //OKГэта таксама адносіцца да параметраў абвешчаны канчатковым.
Глядзець
у BigDecimal IBM і Arcimath BigDecimal маюць прыстасаванні для выяўлення перапаўнення і генерацыі выключэння. Але вы можаце самастойна з такі код ў стандартны Java.
or
Калі вы ведаеце, абодва значэння дадатныя, вы можаце выкарыстоўваць простую праверку перапаўнення. Вы можаце праверыць, калі сума менш 0 або менш, чым адзін з двух аперанд. Я не ўпэўнены, што ловіць усё перапаўнення, аднак.
Арыфметыку з якая плавае кропкай выкарыстоўвае IEEE памылкі распаўсюджваецца схеме, аналагічнай выкарыстанай у табліцу, каб распаўсюджвацца несапраўднымі сцягі значэння ў ячэйкі, якія залежаць ад недапушчальных значэнняў. У Java, хоць няма перапаўнення перапыненняў або паведамлення, ёсць добрыя шанцы, вы ў рэшце рэшт даведаліся пра памылка перапаўнення, калі вы бачыце java.lang.Double.POSITIVE_INFINITY, java.lang.Double.NEGATIVE_INFINITY або java.lang. Double.NaN з'яўляецца ў адным з вашых падвойных пераменных. Вы не можаце выкарыстоўваць == для праверкі NaN, вы павінны выкарыстоўваць java.lang.Double.isNan ().
Назад, калі Зямля была яшчэ расплаўленай, калі сімвалы засталіся толькі 7 біт, хто-то думаў, што гэта будзе добрая ідэя, калі знакі былі падпісаныя. Гэта выклікала раскол у свеце C, калі 8-бітныя сімвалы пазней з'явіўся. Java дадаў бяззнакавыя 16-бітны Unicode сімвалы, але вырашылі падтрымаць толькі падпісаныя 8-бітавых знакаў, вядомы як байт. Магчыма, дызайнеры Java, хацеў заахвочванне міграцыі ў Юнікод шляхам апрацоўкі бяззнакавыя байтаў няёмка. У любым выпадку, вы часцей за ўсё хочуць бяззнакавыя 8-бітныя сімвалы, не падпісаны.
int i1 = b2 & 0xff; byte b2 = (byte)( b2 + 1 ); byte b3 = b2;
Аддзел павярховым тое, што вы звычайна хочуць, калі спрабуюць высветліць, якія бен належыць элемент у якой Вы можаце
Для вылічэння, колькі фіксаванага памеру бункераў неабходна ўтрымліваць N элементаў, вы хочаце ceiled падзелу, таксама вядомы як пакрытыя фактар. Вы можаце вылічыць пакрытыя фактар, як:
| Inconsistent Signs | ||
|---|---|---|
| Signs | Division | Modulus |
| + + | +7/+4=+1 | +7%+4=+3 |
| - + | -7/+4=-1 | -7%+4=-3 |
| + - | +7/-4=-1 | +7%-4=+3 |
| - - | -7/-4=+1 | -7%-4=-3 |
static { calcPriceTab();}Навічкі проста прытрымлівацца такой код у любым месцы ўнутры класа {} сэндвіч і збянтэжаныя якія ўводзяць у зман паведамленні аб памылках.
Парадак вашых зменных, якія статычна ініцыялізуецца пытанні. Лічыце, што гэта маленькая праграма:
Выхад з Java 1.4.1 была не памылка на этапе кампіляцыі і 61 0 61, YMMV.Парадак гэтых трох статычных фінал мае вырашальнае значэнне для вынікаў! Вы павінны змясціць іх у парадку, вы хочаце зрабіць разлікі. Java не з'яўляецца элегантным, як табліцу, каб зрабіць натуральны recalcs для Вас. Гэта апавяшчэнне і альбо ручкі або адхіліць такія спасылкі наперад, калі толькі литералы і простых зменных ўдзельнічаюць, але як толькі вы робіце рэчы ўнутры метадаў, яна кідае свае рукі і кажа аб вашай ўласнай галаве і быць.
Перавага паставіўшы яго на дэкларацыі з'яўляецца тое, што вам трэба паказаць толькі адзін раз, не адзін раз для кожнага канструктара. Гэта азначае, што менш верагоднасць памылкі, калі яе значэнне ўсё змянілася. Іншыя бяспечныя падыход паставіць усё ініцыялізацыі кода ў адным метадзе або адзін канструктар і ўсё канструктары называюць яго.
Аднак, ёсць адна асабліва складаная праблема з ініцыялізацыяй парадку. Увогуле, вы павінны пазбягаць выкліку любога не канчатковыя метады ў канструктар. Праблема ў тым, напрыклад initialisers/пераменная ініцыялізацыі ў вытворных класе ажыццяўляецца пасля канструктара базавага класа. Гэта можа выклікаць праблемы, калі базавы канструктар класа выклікае метад паліморфным, так як гэты метад будзе мяркуючы яго вытворныя палёў класа ўсе былі ініцыялізуецца, калі яны гэтага не зрабілі.
Так базе канструктараў класа можна смела называць прыватнымі або канчатковы метады базавага класа ўмове, што гэтыя метады, прама ці ўскосна выклікаць толькі прыватнымі або канчатковы метады базавага класа. Пры выкліку метадаў у канструктару паліморфным, кампілятар не будзе спыніць або папярэдзіць вас пра ініцыялізацыі пасткі чакаюць.
Ёсць чатыры віды ролях:
byte b = -42; int i = (int)b;Гэта прывядзенне безвыніковым, хоць вы можаце выкарыстоўваць кінута як дакументацыя дапамогі. Яна робіць некаторыя пераўтварэнні працы - знакавая пашырэнне.
Int I = - 16411; байт = B (б) я;
Гэты стыль літых на самой справе могуць рабіць некаторыя рэальныя працы пераўтварэнні - абнулення старэйшых бітаў.
Сабака МуОод = (сабака) aDalmatian;Гэта прывядзенне безвыніковым, хоць вы можаце выкарыстоўваць выпадку, як дакументацыя дапамогі. Усе далмацін аўтаматычна ўсе сабакі поля, так што гэта ліццё не мае часу выканання накладныя выдаткі.
Далматин myDalmatian = (далматин) aDog;Падчас выканання гэтага літой на самай справе правярае, што aDog сапраўды ўжо далматина, і павышае ClassCastException, калі гэта не так. Гэта не робіць любыя спробы пераўтварыць сабаку далматин.
Вы маглі б лагічна выказаць здагадку, што ставіць пад прызначаны для пераўтварэння аднаго тыпу ў іншы. Вы маглі б паспрабаваць код, як
String s1 = (String) i; int i = (int) s2; String s3 = (String) myDalmatian;Тым не менш ліцця працуе толькі для двух прымітываў. Калі ёсць прымітыўным і аб'екта, для якога існуе сістэма функцый пераўтварэнні прыкладна з такой жа рэгулярнасцю, як французскія дзеясловы.
CAT C = NULL; Аб'ект O = C; Далматин D = (далматин) O;Іншымі словамі, ёсць адно ўніверсальны прадстаўленне для нуль, а не асаблівы для кожнага класа.
У адрозненне, калі (нуль асобнікам сабакі) заўсёды фальшыва. Асобнікам робіць фільтр з нулёў.
Dog fido = new Dalmatian(); int spots = (Dalmatian)fido.spotCount();Падказка: Што вы спрабуеце кінуць у Далмацыі, Fido сабака або Int выніку spotCount метад? Пры ліццё, вам часта даводзіцца карыстацца лесам дужках. Гэта тое, што вы павінны мець напісана:
Сабака Фидо = новы далматин (); Int плямы = ((далматин) Fido)). SpotCount (;
(B) ((() В. А... Атрымаць (0) б)) х. C =;Што гэта значыць? Атрымаць першы элемент вектара В. А. (аб'ектаў), прывядзенне яго ў аб'ект, які затым, выкарыстоўваючы поле B, паказвае на іншы аб'ект. У ролях, што аб'ект класа B. У гэты аб'ект спасылкі з String, што вы хочаце значэнне х.
Гэта было б нашмат прасцей чытаць:
In getting those ()((()()))) right, count +1 for each ( and -1 for each ). Вы павінны атрымаць назад да 0 ў канцы і ў любым месцы вы думаеце, вы павінны быць па-за ўсіх (). Вы ніколі не павінны ісці адмоўным. У гэтым выпадку над вамі ацэнак:
Праблема ў тым, пякельная сумесь прэфікс, Postfix і инфиксной аператараў, Java атрымаў у спадчыну ад С. (Па крайняй меры кретиничности струнных X [] з'яўляецца свайго роду сышоў).
У мове з Postfix кідае і ліслівіць перавага, што можа выглядаць так:
Java выкарыстоўваецца аператар "+" азначае, як таго і канкатэнацыі. Парсер могуць адназначна высветліць, якія вашыя намеры ад кантэксту, але людзі могуць так лёгка абдурыць. Напрыклад:
Сістэма у.) З. Println ("X + Y + X +; з сістэмы.. println (X + Y + "X + Y");
Якія + складанне? Якія аб'яднання?
Тое, як вы часцей за ўсё патрапіць з'яўляецца код, падобны гэтаму, дзе апошнія + разглядаецца як канкатэнацыі.
Сістэма 1.) З. Println ("значэнне:" + V +;
Аператар канкатэнацыі валодае магічнай сілай, якое дазваляе няяўна прымушаць Int ў String шляхам аўтаматычнага выкліку
статычную радок цэлае. ToString (INT)
метад, аднак, як ні дзіўна, вы не можаце зрабіць тое ж самае відавочна з (String) акцёраў.
System.out.println( 'A' ); System.out.println( 'A' + 'B' );Вы маглі б чакаць naiively: AB, ці, магчыма, 65 131, аднак, адказ: 131.
Праблема ў тым, дызайн памылкай у Java выкарыстання + для абазначэння як таго і канкатэнацыі. Даданне таксама спрыяе Int, які println адлюстроўваецца інакш, чым знак.
Я сапраўды жадаю гэта выпраўлена. Аб'яднанне павінна атрымаць новы сімвал аператара і выкарыстання + для аб'яднання павінна быць састарэлымі. Цяперашняя схема прыводзіць да код занадта лёгка няправільна. + З Int можа азначаць альбо таго або аб'яднання. Прыняцце рашэння якой залежыць занадта шмат на тонкія ключы кантэксце.
Сімптомы гэтага Гоча атрымліваеце два ChangeEvent S спрацоўвае, дзе можна чакаць толькі адзін, ці з выкарыстаннем removeChangeListener і падзеі працягваюць прыбываць. Загваздка ў тым, вы павінны выклікаць addChangeListener толькі адзін раз. Калі вы называеце гэта ў два разы з тым жа дэлегаты, вы стварылі два прымача з кожнага атрымліваць копію кожнага ChangeEvent. AddChangeListener дадае другі ChangeListener нават калі ён ужо дадаў. Аналагічным чынам, removeChangeListener толькі выдаляе першы знойдзены ChangeListener ён знаходзіць, а не дубліруе таксама. Гэта адносіцца да ўсіх тыпаў слухач.
Ёсць 10 распаўсюджаных тыпаў апрацоўкі знакаў у Java
| Дзесяць тыпаў знакаў Апрацоўка | ||||
|---|---|---|---|---|
| Тып | змяняныя? | памер у бітах | падпісаў? | Апісанне |
| String | няўхільны | 16 | непадпісаны | Unicode |
| StringBuffer | Змяняныя як у вартасным, і памер | 16 | непадпісаны | Unicode |
| StringBuilder | Змяняныя як у вартасным, і памер. Хутчэй, чым StringBuffer, але толькі ў Java версіі 1.5 або больш позняй версіі | 16 | непадпісаны | Unicode |
| FastCat | Змяняныя як у вартасным, і памер. Хутчэй, чым калі StringBuilder аб'яднання радкоў, а не сімвалы. Лягчэй для ацэнкі памеру. | 16 | непадпісаны | Unicode |
| сімвал | змяняныя значэння | 16 | непадпісаны | індывідуальны характар ??Unicode. |
| Характар | няўхільны | 16 | непадпісаны | Юнікод аб'екта. |
| сімвал [] | змяняныя значэння | 16 | непадпісаны | масіў сімвалаў Unicode. |
| байт | змяняныя значэння | 8 | падпісаны | асобных ASCII сімвалаў. |
| Байт | няўхільны | 8 | падпісаны | ASCII-сімвал аб'екта. |
| Byte [] | змяняныя значэння | 8 | падпісаны | масіў сімвалаў ASCII. |
| UTF | няўхільны | 8/16 | непадпісаны | 16-біт, 7-бітныя сімвалы, многобайтовые коды для 16-бітных знакаў з высокім біт. |
Нарэшце можа прывесці да блытаніны. Нарэшце, ключавое слова ў адказ на Java C + + деструкторы. У C + +, калі аўтаматычная аб'екты выходзяць з сферы (нават у выніку кінулі выключэнне), аб'ектаў деструкторы выклікаюцца ў дакладна вызначаных мэтах. Java мае збор смецця і не деструкторы, так што неабходна нейкім чынам гарантаваць, што некаторыя рэчы перад выхадам з рамкі. Нарэшце, дазваляе дасягнуць гэтага, але калі вы пакладзеце пэўныя віды справаздачнасці ў рэшце рэшт блокаў, вы можаце заблытаць сябе. Наступныя
Акрамя таго, паводзіны выключэнняў ўнутры блокаў, нарэшце, не з'яўляецца відавочным.Эмпірычнае правіла: ніколі не лічыць, што JDK аб'ектаў, з'яўляюцца ніцевыя. Не думаю: "О, я ўпэўнены, я здагадваюся, ажыццяўлення, і ён павінен быць ніцевыя." Напрыклад, java.util.SimpleDateFormat не ніцевыя, так што рэчы, як гэта можа выклікаць дзіўныя памылкі фарматавання
Для большай эфектыўнасці, часта можна выкарыстоўваць доўгія або INT, і сачыць за маштабаванне сябе, і ўстаўка дэкаратыўных дзесятковай кропкі на выхадзе.
BigDecimal з'яўляецца пародыяй і заслугоўвае маліны як дата. Карацей кажучы, гэта вельмі павольны працэс, цяжка выкарыстоўваць, яна выкарыстоўвае ўласныя метады, і ён ціха падае ўважаецца лічбаў у працэсе пераўтварэння.
Акрамя таго, java.text. DecimalFormat. Разбору вяртае альбо доўгі або Double. Існуе няма ўбудаванага спосабу вызначыць карыстацкі фармат нумары BigDecimal або BigInteger аб'ектаў.
На шчасце, IBM зрабіла даступнымі яго замены прапануецца для свайго класа Сонца, якія ў 23 разы хутчэй, менш, не выкарыстоўвае ўласныя метады, і рэалізуе стандартны ANSI X3.274 плавае арыфметыкі. Для спектраў гл.: IBM, дзесятковай арыфметыкі для Java і AlphaWorks. Дырк Bosmans рэалізаваны спектр IBM як ArciMath. Іншая рэалізацыя PSPDec.
Java. AWT. Графікі. DrawRect (INT X, Y Int, Int шырыня, вышыня Int)
Малюе прастакутнік адзін піксель больш названай шырыні і вышыні. Мне сказалі, калі вы разумееце, абстрактная мадэль малявання AWT выкарыстоўвае, аказваецца, гэты дадатковы піксель наўмысных і непазбежнымі. Абгрунтоўваецца тым, што вы паказваеце шлях ідэалізаваны акно звяртаецца з бясконца тонкімі лініямі, і ручка вісіць ўніз і направа, па меншай меры адзін піксель таўшчынёй.
Уся графіка працэдур чакаць х, у прадстаўляць верхнім левым куце абмежавальнай рамкі. Аднак для графікі. DrawString () X, Y ставіцца да з базавым (які адрозніваецца яшчэ раз ад левым ніжнім куце). Гэта супярэчнасць з'яўляецца традыцыйнай у распрацоўцы пакетаў. Вы павінны
г). DrawString ("Hello World", 0, getFontMetrics (GetFont () (). getAscent);
GridBagLayout будзе генераваць Гуфи макеты, калі кампаненты забяспечваюць некарэктныя нумары для мінімальнага і патрэбны памер. Напрыклад TextField S не прымаць пад увагу SetColumns або памеру бягучага шрыфта. Усё, што вы можаце зрабіць, гэта выдумкі выкарыстаннем ipadx і ipady параметраў, каб раздуць мінімальнага памеру.
GridBayLayout не пярэчыць, калі ў вас ёсць радкі або слупкі з чым у ім. Гэта зойме не займаюць месцы. Вы маглі б пакінуць некалькі пустых радкоў і слупкоў у макеты для будучага пашырэння.
weightx і важкі кіравання, дзе ідзе дадатковае прастору, калі кантэйнер пашыраны. Думайце пра іх як пра працэнтах, якія не павінны дадаць да 100%. Яны аўтаматычна нармалізаваная. Каб высветліць, якія калонкі павінны атрымаць большую частку прасторы, GridBagLayout разглядае кожнага кампанента ў калонцы, і глядзіць на яго weightx. Гэта эканоміць найбуйнейшых weightx ўсіх кампанентаў у гэтым слупку, як вага для ўсяго слупка. Гэта не сярэдні іх, ці дадаць іх. Тады прапарцыйна прызначае дадатковае прастору на аснове слупка вагі. Кампаненты з вялікай вага не абавязкова расці, толькі слупок, кампаненты цалі дае роўныя, але ненулявой вага калоны імкнецца выраўнаваць іх памеры.
GridBagLayout робіць тое ж самае вылучэння дадатковага прасторы для радкоў з дапамогай важкіх.
Ўстаўкі (зверху, злева, знізу, справа) можа быць выкарыстаны для стварэння рамкі вакол кампанента. Чатыры лічбы вымяраюцца ў піксэлях.
Калі вы жадаеце выправіць памер некаторых элементаў, вы павінны выкарыстоўваць усе тры метаду: setMinimumSize, setMaxiumSize і setPreferredSize.
Пераканайцеся, што вы некаторы ненулявое х і ў вагаў у вашу GridBag. У адваротным выпадку, калі Вы сціскаеце кадра ўніз занадта малы кампаненты будуць дзейнічаць, як быццам яны бясконцай прасторы і будзе ўцякаць вар'яцка закадравы з правага боку.
Калі вы выкарыстоўваеце GridBagConstraints.BOTH, прымушаючы запоўніць, то яна перакрые любую setMaximumSize вы, магчыма, указаны на вашай панэлі.
setVisible () выклікае састарэлым Show (), адваротнае, што вы маглі чакаць. Можна падумаць, састарэлым метадам павінны несці пакаранне хуткасць іншага ўзроўня ўскосна. Але што адбудзецца, калі вы пішаце новую setVisible () выкарыстоўваецца для пераазначэння аднаго з убудаваных у іх. Карыстальнікі арыгінальнае шоу () метад не будуць закрануты. Яны будуць працягваць выкарыстоўваць стары код. Толькі тыя, хто непасрэдна выклікаць setVisible () будзе выкарыстоўваць свой ??новы парадак. Зараз, разгледзім, што адбудзецца, калі вы пішаце новую састарэлым Show () метад для пераазначэння аднаго з убудаваных у іх. Усё працуе правільна, кожны будзе выкарыстоўваць свой новы метад. Вы, такім чынам, затрымаўся напісання новых састарэлымі метадамі, калі вы хочаце, каб ваш код працаваў карэктна.
Скажам AWT былі перапрацаваныя так, што замест Show () завецца setVisible (). Тады стары код, які выкарыстаў забароненыя метады раптам перастаюць працаваць.
Гэтая праблема носіць агульны характар ??і распаўсюджваецца на ўсе састарэлыя метады. Будзем спадзявацца, Сонца будзе хутчэй пазбавіцца ад састарэлых метадаў цалкам, то гэтая праблема знікне. Большасць састарэлых імёнаў толькі імя змены, каб адпавядаць JavaBeans атрымаць/устанавіць канвенцый. Такія састарэлых могуць быць разгледжаны як чыста псеўданімы перакладу на новыя імёны ў кампілятар, і пакончыць са старымі класамі цалкам. Разам з тым, што выкліча палітычныя праблемы JDK 1.0.2 код больш не працуе пад Java версіі 1.6 або больш позняй версіі без перакампілявання або якой-небудзь працэс перакладу. Вы не маглі б мець код, які будзе працаваць як пад JDK 1,02 і 1,1. Мы павінны падтрымліваць працэс пераводу ў JVM, каб стары код аўтаматычна выкарыстоўваць новыя імёны. Сонца вельмі неахвотна ідуць на любыя змены ў JVM.
JDK 1.0.2 працэдурах апрацоўкі падзей і састарэлым. Гэта крыху больш працы, каб канвертаваць гэтыя. Яны не маглі быць апрацаваныя з дапамогай простага псеўданіма.
int BufferedInputStream.read( byte[] m, int offset, int len )рэкламуецца блакаваць да некаторых ўваходных даступная. Яна вяртае колькасць лічаных байтаў або -1 для EOF. Вы маглі б памылкова лічыць, што ён блакуе альбо:
int BufferedReader.read ( char[] m, int offset, int len )мае аналагічныя Гоча. Вы павінны выкарыстоўваць java.io.DataInputStream.readFully, калі вы хочаце атрымаць усе байты вы прасілі.
Чытаць руціннай іншая праблема. Гэта пасткі і ігнаруе IOException S, а не перадаючы іх на вас. Каб абыйсці як вышэй праблемы, вы можаце выкарыстоўваць свае ўласныя чытаць руціннай так:
Для больш складаных код для працы з праблемай загрузкі com.mindprod.http пакет і спампаваць com.mindprod.filetransfer пакет. Вы таксама можаце паглядзець некаторыя з кода ў HTTP- запісу.Я не ведаю ні аднаго метаду, які дазволіць вам схаваць кампанент, што не адмяняе, у выніку чаго яго месца, прызначанае, без ператасоўкі брат кампанентаў.
Дыялог фону атрымлівае скіду, калі дыялогавае рыхтуецца да дысплей, так што ваш выклік setBackground (або setForeground) у канструктар не будзе
public void addNotify() { super.addNotify(); setBackground( Color.red ); }Дадаць паведаміць стварае аднагодкаў аб'екта. Вы перахопу кода ў адразу пасля аднагодкаў атрымлівае створаны.
Акрамя таго, неабходна дакладна кантраляваць фоне кожнага кампанента. Пераняўшы ад Дыялог будзе проста даць шэры.
Яшчэ адно папярэджанне. У JDK 1.0, мадальных асаблівасць дыялогаў не працуе.
Да NiO, не было выбару (), як функцыянальнасць у разеткі (а калі быць больш гнуткай, у InputStreams) і не было таймаўту ў InputStream.read () метад. Гэта робіць немагчымым для праграмы сервера Socket якія маюць колькасць патокаў менш, чым колькасць карыстальнікаў. Аднак, як мне сказалі, што пры выкарыстанні наяўных () метад спрытна вы можаце гэта выдумкі.
У вас ёсць некаторы кантроль над тайм-ауты з ўласцівасці сетак.
Калі вы карыстаецеся для шаблоннага ўключаюць верхнія і ніжнія колонтитулы, то вы можаце атрымаць ClassNotFoundException калі ўключаны JSP, выкарыстоўвае карыстацкі клас.
ASP распрацоўшчыкі выкарыстоўвалі ў зыходны код, знікаюць у препроцессором ASP і інтэрпрэтуецца як адзін вялікі файл. Па гэтай логіцы імпарт заява будзе чакаць з'яўлення ў верхняй частцы "старонка", дзе большасць PPL аб'явы зменных і вызначыць функцыі ў ASP. Аднак у JSP, рэчы, як правіла, падзеленыя і знаходжання падзеленая на шмат маленькіх файлаў. Вы павінны пераканацца, што такім чынам імпарт ідзе ў кожным файле, які яго выкарыстоўвае, а не толькі ў самым пачатку.
Глядзіце табліцу паведамленняў аб памылках, зараз асобны дакумент.
На жаль, адрасы электроннай пошты ніжэй, не з'яўляюцца інтэрактыўнымі. Далей вы не можаце капіяваць/ўставіць іх у Вашу паштовую праграму. Неабходна ўручную паўторна ўводзіць іх. Адрасы электроннай пошты графічных *. PNG вобразы, створаныя Masker. Я нязручнасці такім чынам, каб перашкаджаць спамераў ад уборкі адрасы электроннай пошты з вэб-сайта з аўтаматычнай індэксацыі сайта.
| Аўтары | |
|---|---|
| Тов ці | |
| Пол ван Keep | |
| Майк Коулишо | |
| П'ер Baillargeon | |
| Біл Ўілкінсан | |
| Патрысія Шанахан | |
| Іосіф Bowbeer | |
| Чарльз Томас | |
| Джоэл Крыспа | |
| Эрык Наглер | |
| Даніэль Leuck | |
| Уільям Брогден | |
| Іў Bossu | |
| Чад Лодер | |
| Savas Алпарслан | |
| Сайман Гібс | |
| Лоўрэнс Vanhelsuwe | |
| Норман Патерсон | |
| Джонатан Фін | |