No client transport named ‘null’ found

2013-08-13

Tänkte bara skriva en rad om detta hemska exception… När man googlar om det här felet så hittar man inlägg efter inlägg efter inlägg med folk som råkat ut för det här, men ingenstans finns det några vettiga svar.

När uppstår det här felet?

Jo, framförallt när man jobbar med Webservices. Detta fel uppstår som ett RemoteException, och av alla google-svar att döma så verkar det vanligaste felet till denna exception vara att endpoint inte är satt korrekt/saknas. Därför torde steg ett i felsökningen vara att kolla att du har en endpoint, och att den är giltig. Du kan kolla detta genom att öppna din browser, skriv in endpoint-adressen och tryck enter. Får du inget svar? Då vet du vad du skall kolla på härnäst. Då är din endpoint fel.

Om du dock får svar, och allt ser ut att vara frid o fröjd, men när du deployar ditt projekt på servern så fungerar det ändå inte.

Då har du troligtvis råkat ut för samma sak som mig: BRANDVÄGG! Kolla att brandväggen låter servern kommunicera utåt med internet (eller framförallt din endpoint-adress).

Så detta får bli en liten minnesanteckning för framtiden… Kolla även brandväggen!

Annonser

Refactoring är inte alltid så lätt…

2013-07-29

Jag har stött på ett litet problem; Jag sitter och skall göra en liten refactoring av en klass och funderar på hur man bäst skall gå tillväga. Här är min main-kod i min klass:


try {
 initialize();
 if (this.orderId.equals("")) {
  createErrorResponseOrderNumberIsMissing();
  outputResponse.println(jsonReturn.toJSON());
  return;
 }
 this.orderDocument = allOrders.getDocumentByKey(this.orderId);
 if (this.orderDocument == null) {
  createErrorResponseOrderNotFound();
 } else {
  processOrderDocument();
  createResponseMessage();
 }
 outputResponse.println(jsonReturn.toJSON());
} catch(Exception e) {
.... exception handling snipped out of this example... not of interest right now! ...
}

Mitt problem med koden är att jag inte gillar att ha två olika exit-points i koden; du har en om ordernummer saknas och en annan för alla andra resultat. Jag skulle vilja ha endast en exitpoint – den som finns precis före catch-satsen. Men hur löser jag att det finns två villkor som måste uppfyllas varav det andra inte kan kontrolleras såvida inte en lookup utförs, där argumentet för lookupen baseras på det första värdet i villkoret?

Jag vill ju inte utföra lookupen om ordernummer inte finns angiven – då kommer jag att få en massa följdfel som inte är önskvärt. Jag skulle önska att lookupen hellre returnerade en exception om man anger ett sträng utan innehåll som argument. Det gör den. Det blir då NullPointerException. Jag skulle kunna fånga upp detta fel och hantera detta, men eftersom det kan bli NullPointerException var somhelst i koden så har jag ingen koll att just denna NPE handlar om att ordernummer saknas.

Hur löste jag detta?

Det var tanken på att hantera ett exception som ledde mig åt rätt håll. Eftersom lookupen utförs av en 3:e parts produkt som jag inte kan modifiera så beslöt jag mig för att ändra min klass ”ReturnMessage” – vilket är den lokala variabeln jsonReturn som sätts i initialize() till objektet ReturnMessage;

this.jsonReturn = new ReturnMessage();

Jag beslutade mig för att den inte fick initieras utan argument. Konstruktorn utan argument togs bort så att man måste ange ReturnMessage(String id) istället. I konstruktorn kan jag sedan slänga en egen (ny) exception; OrderIdMissingException.

Nästa förändring som var tvunget för att detta skulle fungera är att ändra hur man initierar jsonReturn. Detta lades till i initialize()-metoden:

this.jsonReturn = new ReturnMessage(getOrderId());

(Och nej – jag kan inte lägga in exception-kontrollen i ”getOrderId”-metoden, för denna används på fler ställen där det skall vara fullt legalt att använda en tom sträng och inget exception får då genereras!)

I main-funktionen kunde jag sedan lägga till catch-sats för detta exception och skapa felmeddelandet där istället:


catch(OrderIdMissingException exception) {
 createErrorResponseOrderNumberIsMissing();
}

Jag flyttade också outputResponse.println(jsonReturn.toJSON()); till finally-satsen. Så här blev koden till slut:


try {
 initialize();
  this.docOrder = allOrders.getDocumentByKey(jsonReturn.orderId);
  if (this.docOrder == null) {
   createErrorResponseOrderNotFound();
  } else {
   processOrderDocument();
   createResponseMessage();
  }
 } catch(OrderIdNotSuppliedException missingOrderIdException) {
  createErrorResponseOrderNumberIsMissing();
 } catch(Exception e) {
... exclueded exceptionhandling from example...
 } finally {
  outputResponse.println(jsonReturn.toJSON());
 }

Eller är det någon som har förslag på en bättre lösning?


Alla kan vi göra nybörjarmisstag…

2013-03-19

Jag tycker att jag själv är en rätt så duktig programmerare och sköter mitt jobb och tar fram den ena kodsnutten efter den andra och får allt att fungera, men jag måste erkänna; även jag gör nybörjarmisstag ibland!

Tänkte faktiskt dela med mig av ett här. Det tog mig någon timma innan jag gav mig själv en ”facepalm” och korrigerade felet på en sekund. Allt handlar om ”typecasting”, dvs när man konverterar ett objekt till ett annat objekt t.ex. (som i det här fallet) en double till int.

Bakgrund: Eftersom det i HTML finns en begränsning att ett input-fält inte kan ha mer än 32767 tecken så behövde jag i min kod räkna ut när jag överskrider ett fördefinierat tröskelvärde och därefter vidta åtgärder.

Så jag började med följande:


//Declared as constant in the top of the class!
private final int MAXIMUM_STRING_LENGTH = 32767;

public int getPercentOfFieldsize() {
int pct = 0;
try {
double testvalue = 16383;
pct = (int) Math.round( (testvalue / MAXIMUM_STRING_LENGTH)*100f);
System.out.println("Current pct: " + pct);
} catch (Exception e) {}
return pct;
}

Ok, så här långt är allt frid och fröjd. Jag fick ut att pct i det här fallet blev 50 och då visste jag att procentuträkningen var korrekt. Trodde jag. Jag ersatte därefter variablen testvalue med min genererade sträng:


String full = stringGenerator.toString();
int pct = (int) Math.round( (full.length() / MAXIMUM_STRING_LENGTH) * 100f);

Plötsligt blev resultatet 0! Detta trots att det borde ha varit runt 50 såsom mitt testvärde var. Ser Ni vad felet är?

Metoden .length() returnerar en int.

Konstanten MAXIMUM_STRING_LENGTH är en int.

Om du dividerar en int med en annan int så kommer resultatet att konverteras till en int innan det sker en multiplikation med 100f. Dela 16000 med 32767 och avrunda detta till en int och du får 0!

Lösningen var att konvertera konstanten till en double:


private final double MAXIMUM_STRING_LENGTH = 32767;

Då kommer nämligen att både täljare och nämnare att behandlas som double och divisionen returnera en double! *duh* Ett sådant billigt nybörjarmisstag…


Sortering av en Collection med Vector

2013-03-11

Här kommer ett litet intressant programmeringsproblem jag råkade ut för nyligen.

Att sortera en Vector är inga större problem; du anropar bara Collections.sort(myVector) och den sorterar alla items i din Vector. Men hur gör man egentligen om man har en hel collection av vectorer där man sedan skall sortera vectorerna baserad på ett av deras index/items?

T.ex. jag har


Vector vector1 = new Vector();
Vector vector2 = new Vector();
Vector vector3 = new Vector();

där jag har populerat ett antal items i varje vector, t.ex:


vector1.add("e");
vector1.add("f");
vector1.add("g");

vector2.add("a");
vector2.add("x");
vector2.add("m");

vector3.add("s");
vector3.add("o");
vector3.add("p");

och jag sedan lägger dem alla i en ny vector:


Vector<Vector> all = new Vector<Vector>();
all.add(vector1);
all.add(vector2);
all.add(vector3);

Om jag nu försöker skriva Collections.sort(all) så kommer det inte att fungera; editorn kommer att klaga på ”Bound mismatch: The generic method sort(List<T>) of type Collection is not…….” och du kommer inte att kunna kompilera koden. Hur gör jag om jag vill sortera på varje vectors första item? Eller andra? Eller låta användaren välja?

För att lösa detta så behöver vi skapa en s.k. Comparator, som implementerar metoden compare:


import java.util.Comparator;
import java.util.Vector;

public class VectorComparator implements Comparator<Vector<String>> {
@Override
public int compare(Vector<String> o1, Vector<String> o2) {
//TODO: Auto-generated code
}
}

Metoden compare skall returnera -1, 0 eller 1 beroende på om o1 är större än, lika med eller mindre än o2. Då behöver vi veta vilket index som vi skall använda oss av i vector o1 och o2. Vi lägger till följande privata fält och konstruktor för klassen:


private int useIndex = 0;

public VectorComparator() {
}
public VectorComparator(int index) {
this.useIndex = index;
}

Och då kan vi beräknade compare-metoden till följande:


return o1.get(useIndex).toString().compareTo( o2.get(useIndex).toString());

Här är hela klassen då jag har lagt till lite felhantering i compare-metoden:


import java.util.Comparator;
import java.util.Vector;

public class VectorComparator implements Comparator<Vector<String>> {
private int useIndex = 0;

public VectorComparator() {
}
public VectorComparator(int index) {
this.useIndex = index;
}

@Override
public int compare(Vector<String> o1, Vector<String> o2) {
if (useIndex <= o1.size() && useIndex >= 0) {
return o1.get(useIndex).toString().compareTo( o2.get(useIndex).toString());
} else {
throw new RuntimeException("Index out of bounds; max size is '" + Integer.toString(o1.size()) + "'!");
}
}
}

Nu kan vi använda vår comparator för att sortera:


VectorComparator comparator = new VectorComparator(1);
Collections.sort(all,comparator);

och vår collection av vectorer kommer att vara sorterad på varje vectors andra item!

Svårare än så var det inte…

Vill du veta mer om Comparator? Läs här: Vogella.com eller på Java Doc.


Vad är en klass?

2012-09-07

Vad är egentligen en klass när vi pratar om programmering – vare sig det är Java, .Net, eller php…? Jag har under 20 års tid använt klasser till höger och vänster, men egentligen aldrig funderat på vad en klass EGENTLIGEN är. Googlar man frågan så finner man tusentals artiklar som handlar om HUR man använder klasser och vilka delar som utgör en klass, men ingenstans har jag funnit svaret på den mer övergripande (något abstrakta) frågeställningen: vad är egentligen en klass?

Därför tog jag ett steg tillbaka och funderade själv; när använder man klasser och varför? Programmerar du Java så kan du inte undvika att använda klasser – du kan inte ens starta ett Java-projekt utan ha en klass med en main() funktion i den. Jo, jag använder klasser för att samla ihop funktioner som hjälper mig att hantera en enskild uppgift. Visst kan en klass i princip utföra flera uppgifter, men läser man ”Clean Code – A Handbook of Agile Software Craftsmanship” av Robert C. Martin så skall ju varje klass endast utföra en endaste sak och göra det transparent (dvs det skall inte råda några tveksamheter om vad klassen gör).

Räcker det med att säga att en klass är samlad kod som innehåller en eller flera metoder som skickar data mellan sig med hjälp av lokala fält? Nej, jag tycker inte det. En klass är ju inte bara en samling funktioner – hela den här samlingen av fält och metoder representerar ju någonting annat. De representerar ju ett objekt, eller? Egentligen inte! Går vi vidare i abstraktionen av fält, metoder, klasser och objekt så landar jag i den här formuleringen:

En klass är en abstraktion av ett objekts strukturella uppbyggnad samt definition av hur den skall konstrueras.

Vad betyder då det här? Jo, att en klass är den abstrakta representationen av ett objekt. Det är först när du har instansierat en klass som det faktiskt blir ett objekt som du processar. Den abstrakta representationen definierar också hur du skall konstruera objektet och vilka externa beroenden som klassen har.

Det här betyder att klassen och objektet är två separata entiteter. Klassen är en mall, en slags ritning över hur objektet faktiskt skall se ut och fungera. Objektet lever sedan sitt liv inne i klassen och styrs av dess regelverk. Klassen definierar hur objektet får användas och vad objektet får göra. Klassen definierar vilka beroenden objektet har att rätta sig efter.

Än sen då?

Hur hjälper det här mig när jag programmerar? Behöver man verkligen förstå att klassen är abstraktion av ett objekt? Det kan det göra – det beror på hur du programmerar och angriper en uppgift. Det är väldigt lätt hänt att man börjar programmera och skriver en klass som gör det, och så bygger man ut den när man upptäcker att det behövs göras mer saker med objektet. Då blir koden väldigt snabbt dålig och svårhanterlig.

Om du då istället tänker på att klassen är en abstraktion så ”tvingar” denna insikt dig att först göra en abstraktion av objektet innan du faktiskt kodar din första rad. Detta kan spara dig mycket problem längre fram…

Vad är Din syn på saken?

Hur långt ifrån sanningen är jag, enligt dig? Skriv en kommentar och ge mig Din syn på saken.